目的
讓物件的外顯行為隨內部狀態的改變而改變,彷彿連類別也跟著改變似的。
別名
objects for states(代表狀態之物件)
動機
物件在不同狀態下,會有不同的行為
時機
當物件行為取決他的狀態時,執行時行為也會隨狀態而改變。(如 Tcp 連線狀態會影響 Tcp 存取的行為)
當有許多列舉狀態,需要根據物件狀態做條件判斷式,但又過於龐大時。
結構
參與者
Context
- 訂制外界感興趣的介面
- 持有 ConcreteState 子類別,代表現行狀態
State
- 負責封裝當 Context 特定狀態的行為
ConcreteState
- 針對某一種 Context 狀態所展現的行為
範例
(圖片來源 : http://www.gamebase.com.tw/forum/4715/topic/86750254/1)
Boss AI 的改變
假設 Boss 在殘血時會改變移動模式與攻擊模式。你就可以設計一個 Interface 作為 IBossMode
並實作階段一跟階段二時的攻擊與移動方式 :
設計當血量低於 1000 時,切換到另一個狀態
藉此改變原本的攻擊模式與移動模式
對照 :
策略模式與狀態模式
策略模式與狀態模式的結構圖,會發現非常的類似 :
狀態模式的結構圖 :
策略模式的結構圖 :
兩者的【目的】不同 :
策略模式 : 定義一整族演算法,將每一個演算法封裝起來,可互換使用,更可在不影響外界的情況下個別抽換所引用的演算法。
狀態模式 : 讓物件的外顯行為隨內部狀態的改變而改變,彷彿連類別也跟著改變似的。
策略模式著重的是【封裝演算法】而狀態模式著重的是【狀態的改變】,所以雖然結構一樣,但要處理的事情不一樣。