設計模式(Design Pattern) – State(狀態模式)

目的

讓物件的外顯行為隨內部狀態的改變而改變,彷彿連類別也跟著改變似的。


別名

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 時,切換到另一個狀態

藉此改變原本的攻擊模式與移動模式

對照 : 


策略模式與狀態模式

策略模式與狀態模式的結構圖,會發現非常的類似 : 

狀態模式的結構圖 : 

策略模式的結構圖 : 

兩者的【目的】不同 : 

策略模式 : 定義一整族演算法,將每一個演算法封裝起來,可互換使用,更可在不影響外界的情況下個別抽換所引用的演算法。

狀態模式 : 讓物件的外顯行為隨內部狀態的改變而改變,彷彿連類別也跟著改變似的。

策略模式著重的是【封裝演算法】而狀態模式著重的是【狀態的改變】,所以雖然結構一樣,但要處理的事情不一樣。

 

 

print

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *