Golang - Design Pattern #24: HSM(Hierarchical State Machine)

更新於 發佈於 閱讀時間約 4 分鐘
raw-image


🌲 結構化狀態機 🌲



在物件導向的世界中,物件的行為會基於它的狀態而改變。當我們面臨更多的狀態和轉換時,狀態機就成為必要,而HSM(Hierarchical State Machine,層次狀態機)模式更是一個進一步的解決方案,它以層次化的方式組織狀態。


HSM 🌲

HSM 在傳統的狀態機上加上層次結構。這種層次結構的好處是可以共享行為,並允許子狀態繼承或覆蓋父狀態的行為。

特點:

  1. 行為繼承:子狀態可以繼承父狀態的行為。
  2. 狀態共享:多個子狀態可以共享相同的行為。
  3. 本地處理:事件可以在當前狀態、父狀態或更高的層次上進行處理。


Going

🚦 紅綠燈

想像一個城市交通燈系統。燈有三種主要狀態:紅燈、黃燈和綠燈。但在每個主要狀態下,都有子狀態,例如:綠燈下有“直行”和“左轉”。
type State interface {
Handle(context *TrafficLightContext)
}

type RedLightState struct{}
func (r *RedLightState) Handle(context *TrafficLightContext) {
// handle red light logic
}

type GreenLightState struct{}
func (g *GreenLightState) Handle(context *TrafficLightContext) {
// handle green light logic
}

type TrafficLightContext struct {
state State
}
func (c *TrafficLightContext) SetState(state State) {
c.state = state
}
func (c *TrafficLightContext) Request() {
c.state.Handle(c)
}

🎮 遊戲角色

在一款遊戲中,玩家角色可能會有多種狀態,例如“站立”、“跑動”、“跳躍”和“受傷”。但在“跑動”狀態中,可能還有子狀態,例如“快跑”和“慢跑”。


type State interface {
Handle(context *GameCharacterContext)
}

type StandingState struct{}
func (s *StandingState) Handle(context *GameCharacterContext) {
// handle standing logic
}

type RunningState struct{}
func (r *RunningState) Handle(context *GameCharacterContext) {
// handle general running logic
}

type SprintingState struct{}
func (s *SprintingState) Handle(context *GameCharacterContext) {
// handle sprinting logic under running
}

type JoggingState struct{}
func (j *JoggingState) Handle(context *GameCharacterContext) {
// handle jogging logic under running
}

type GameCharacterContext struct {
state State
}
func (c *GameCharacterContext) SetState(state State) {
c.state = state
}
func (c *GameCharacterContext) ExecuteAction() {
c.state.Handle(c)
}


結論 🌟

HSM 在處理複雜的狀態邏輯時提供了結構化和直觀的方式。層次狀態機的概念使得行為重用和狀態管理更加清晰。對於那些有許多相互依賴的狀態和轉換的系統,HSM 提供了一個有效的解決方案。



感謝

謝謝大家看完這篇,如果您喜歡我的文章,歡迎 小額贊助我 ^^

留言
avatar-img
留言分享你的想法!
FaShaun Lin-avatar-img
2023/12/01
好像開始偷懶了
avatar-img
KH Huang的沙龍
36會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
KH Huang的沙龍的其他內容
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/06
嗨!今天我們來深入探討鏈式方法模式,也就是讓你可以一路連續調用方法,看起來好像在鏈接它們似的。那麼,讓我們馬上進入主題吧!
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
嗨,大家好!今天我們來聊聊什麼是延遲評估模式,它的好處是啥,還有在 Go 裡面是怎麼玩的。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
2023/09/03
在許多大型系統中,不同的子系統需要共享和修改某些資訊以達到一個共同目的。在這種情況下,傳統的方法可能會造成混亂和冗餘。這時,黑板模式出現了,它提供了一個統一的架構,讓這些子系統可以有效率地協作。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
本期將針對霍爾感測器(Hall Sensor)於馬達中的運作規律,進行說明及解析。係因在我們存在的物理世界當中,事物往往具有各自的脈絡與法則,若能用心體會了解之後妥善運用,皆可進一步的推動科技發展。 由上一期中,理解了霍爾感測器的安裝規則後,再將其對應到馬達旋轉狀態,可以察覺到霍爾訊號變化具備了固
Thumbnail
本期將針對霍爾感測器(Hall Sensor)於馬達中的運作規律,進行說明及解析。係因在我們存在的物理世界當中,事物往往具有各自的脈絡與法則,若能用心體會了解之後妥善運用,皆可進一步的推動科技發展。 由上一期中,理解了霍爾感測器的安裝規則後,再將其對應到馬達旋轉狀態,可以察覺到霍爾訊號變化具備了固
Thumbnail
青春期少年的心理可以分成兩個系統——一個是「動力系統」,另一個是「控制系統」。用汽車打比方,動力系統就好像是油門,控制系統則好像是方向盤和煞車。
Thumbnail
青春期少年的心理可以分成兩個系統——一個是「動力系統」,另一個是「控制系統」。用汽車打比方,動力系統就好像是油門,控制系統則好像是方向盤和煞車。
Thumbnail
上篇提到Hall Sensor的基本擺放位置,本篇就來討論其對應馬達驅動的邏輯脈絡,以及擺放角度變化的可能性。 首先得要核對馬達驅動時的變化種類,了解使用需求後,才能定位Hall Sensor所扮演的角色及功用。以目前主流的三相馬達而言,送電模式共有下述六種;這就代表Hall Sensor只要能提
Thumbnail
上篇提到Hall Sensor的基本擺放位置,本篇就來討論其對應馬達驅動的邏輯脈絡,以及擺放角度變化的可能性。 首先得要核對馬達驅動時的變化種類,了解使用需求後,才能定位Hall Sensor所扮演的角色及功用。以目前主流的三相馬達而言,送電模式共有下述六種;這就代表Hall Sensor只要能提
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
這一篇會介紹非常重要的 JavaScript 函式概念 - 高階函式(Higher-order function),高階函數是將一個或多個函數作為參數,或將一個函數作為結果返回的函數。在本文中,我們將深入探討什麽是高階函數、使用高階函數的好處以及如何在實際應用中使用高階函數,函式導向是什麼?
Thumbnail
在物件導向的世界中,物件的行為會基於它的狀態而改變。當我們面臨更多的狀態和轉換時,狀態機就成為必要,而HSM(Hierarchical State Machine,層次狀態機)模式更是一個進一步的解決方案,它以層次化的方式組織狀態。
Thumbnail
在物件導向的世界中,物件的行為會基於它的狀態而改變。當我們面臨更多的狀態和轉換時,狀態機就成為必要,而HSM(Hierarchical State Machine,層次狀態機)模式更是一個進一步的解決方案,它以層次化的方式組織狀態。
Thumbnail
當我們需要給某個系統或應用程序添加一種新的語言或表達式時,解譯器模式就派上了用場。這種模式提供了一種將句子或表達式分解成多個令牌的方法,然後根據這些令牌進行解釋或解析。
Thumbnail
當我們需要給某個系統或應用程序添加一種新的語言或表達式時,解譯器模式就派上了用場。這種模式提供了一種將句子或表達式分解成多個令牌的方法,然後根據這些令牌進行解釋或解析。
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
續傳遞函數離散化的核心環節,就是將控制器的s轉移函數(s-TF)轉換為z轉移 函數(z-TF)。 一般情況下,由連續到離散的設計最好多實驗幾種方法(通過模擬,得出滿意的 結果)。 用於PID連續系統映射轉換成PID離散系統的方塊圖如下: ■離散化演算法摘要 ■離散化演算法比較 ■MATLAB 指令說
Thumbnail
■控制系統分類 ●依開閉路系統區分 (1)開路系統 (2)閉路控制系統 A.線性系統與非線性系統。 B.時變系統與時不變(非時變)系統。 C.線性時不變系統(俗稱LTI系統) D.因果系統與非因果系統。 ●依系統之訊號性質區分 (1)連續性(類比)控制系統:控制系統內部所處理的信號均為時間的
Thumbnail
■控制系統分類 ●依開閉路系統區分 (1)開路系統 (2)閉路控制系統 A.線性系統與非線性系統。 B.時變系統與時不變(非時變)系統。 C.線性時不變系統(俗稱LTI系統) D.因果系統與非因果系統。 ●依系統之訊號性質區分 (1)連續性(類比)控制系統:控制系統內部所處理的信號均為時間的
Thumbnail
筆者從事建築學習及建築設計的工作大約有三十多年,雖然很少以建築為主題發表文章與看法,不過也一直在探尋有關建築設計創作架構的概念和公式。以上所述,也就是此一探尋的初步結果,而實際應用在建築概念設計的過程、當作一個建築設計的心法之時,也能使個人心中有譜而不至於六神無主,同時避免陷入現代建築哲學的……
Thumbnail
筆者從事建築學習及建築設計的工作大約有三十多年,雖然很少以建築為主題發表文章與看法,不過也一直在探尋有關建築設計創作架構的概念和公式。以上所述,也就是此一探尋的初步結果,而實際應用在建築概念設計的過程、當作一個建築設計的心法之時,也能使個人心中有譜而不至於六神無主,同時避免陷入現代建築哲學的……
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News