🌲 結構化狀態機 🌲
在物件導向的世界中,物件的行為會基於它的狀態而改變。當我們面臨更多的狀態和轉換時,狀態機就成為必要,而HSM(Hierarchical State Machine,層次狀態機)模式更是一個進一步的解決方案,它以層次化的方式組織狀態。
HSM 在傳統的狀態機上加上層次結構。這種層次結構的好處是可以共享行為,並允許子狀態繼承或覆蓋父狀態的行為。
特點:
想像一個城市交通燈系統。燈有三種主要狀態:紅燈、黃燈和綠燈。但在每個主要狀態下,都有子狀態,例如:綠燈下有“直行”和“左轉”。
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 提供了一個有效的解決方案。