分類
行為型模式。
這個模式在解決什麼
狀態模式要處理的是:同一個物件在不同狀態下,應該表現出不同的行為。如果全部塞進一堆 if-else 或 switch,久了很容易失控。
核心做法
它會把每一種狀態拆成獨立物件,讓這些狀態各自負責:
- 進入狀態時要做什麼
- 目前狀態下如何回應外部請求
- 何時切換到下一個狀態
而持有狀態的上下文物件,則只負責保存目前狀態,並把行為委派出去。
什麼時候適合用
很適合拿來做有限狀態機,尤其常見在遊戲 AI、角色流程、互動物件狀態控制。
例子
例如一個敵人 AI 可能有這幾種狀態:
- 巡邏
- 發現玩家後追擊
- 跟丟玩家後搜尋
如果直接把這些行為和切換規則都寫在同一個類別裡,很快就會變成巨量條件判斷。改成狀態模式後,每個狀態都能有自己的更新邏輯與切換條件,整體會清楚很多。
類圖

和策略模式的差別
狀態模式和策略模式的結構很像,但意圖不同。
- 策略模式的重點是替換某個演算法或行為方案,通常是在同一職責下做不同實作
- 狀態模式的重點是表達物件當前所處的狀態,並由狀態主導可執行的行為與轉移
可以粗略理解成:
- 策略比較像「我想換一種做法」
- 狀態比較像「我現在處於另一種情況,所以行為必須不同」
這一篇先記住的重點
- 狀態模式是把條件分支改寫成一組可切換的狀態物件
- 它很適合處理有限狀態機
- 當狀態轉移很多時,這個模式會比堆疊條件判斷更好維護
參考書目
《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates