分類

行為型模式。

這個模式在解決什麼

狀態模式要處理的是:同一個物件在不同狀態下,應該表現出不同的行為。如果全部塞進一堆 if-elseswitch,久了很容易失控。

核心做法

它會把每一種狀態拆成獨立物件,讓這些狀態各自負責:

  • 進入狀態時要做什麼
  • 目前狀態下如何回應外部請求
  • 何時切換到下一個狀態

而持有狀態的上下文物件,則只負責保存目前狀態,並把行為委派出去。

什麼時候適合用

很適合拿來做有限狀態機,尤其常見在遊戲 AI、角色流程、互動物件狀態控制。

例子

例如一個敵人 AI 可能有這幾種狀態:

  • 巡邏
  • 發現玩家後追擊
  • 跟丟玩家後搜尋

如果直接把這些行為和切換規則都寫在同一個類別裡,很快就會變成巨量條件判斷。改成狀態模式後,每個狀態都能有自己的更新邏輯與切換條件,整體會清楚很多。

類圖

和策略模式的差別

狀態模式和策略模式的結構很像,但意圖不同。

  • 策略模式的重點是替換某個演算法或行為方案,通常是在同一職責下做不同實作
  • 狀態模式的重點是表達物件當前所處的狀態,並由狀態主導可執行的行為與轉移

可以粗略理解成:

  • 策略比較像「我想換一種做法」
  • 狀態比較像「我現在處於另一種情況,所以行為必須不同」

這一篇先記住的重點

  • 狀態模式是把條件分支改寫成一組可切換的狀態物件
  • 它很適合處理有限狀態機
  • 當狀態轉移很多時,這個模式會比堆疊條件判斷更好維護

參考書目

《Head First Design Patterns》Eric Freeman, Elisabeth Robson, Kathy Sierra, Bert Bates