狀態機模式(State Pattern)
類型:行為相關
定義:讓一個物件的行為隨著內部狀態的改變而變化,而該物件也像是轉換了類別一樣。
解釋:透過類別來實現有限狀態機(Deterministic Finite Automata)的外貌,每個物件都是一個節點,透過切換正在使用的節點來改變程式的行為。
參與者有以下3個:
狀態擁有者(Context):裡面保有狀態物件,並且可以切換狀態。
狀態介面(State):規範狀態的外觀,通常會定義一些執行狀態內部功能的方法給Context使用。
狀態實作類別(ConcreteState):實作狀態介面,通常有幾個狀態就有幾個類別需要實作。
精神:狀態機。
目的:透過切換程式內部使用的狀態類別,以改變執行的程式碼。
使用時機:當switch中每個狀態的程式碼很多的時候,或是有切換狀態需求的時候。
優點:消掉switch強化開閉原則的實現,分離程式邏輯,易於增加新狀態。
缺點:類別爆炸,每個狀態都要多一個類別,可能需要暴露類別內容給狀態類別知道,破壞封裝。
簡易程式範例:
public class Context { public IState State { protected get; set; } public void Handle(/*需要的資訊*/) { State?.Handle(/*需要的資訊*/); } } public interface IState { void Handle(/*需要的資訊*/); } public class State1 : IState { public void Handle(/*需要的資訊*/) { //做該做的事情 } } public class State2 : IState { public void Handle(/*需要的資訊*/) { //做該做的事情 } } public class State3 : IState { public void Handle(/*需要的資訊*/) { //做該做的事情 } }
UML 類圖(取自維基百科):
1 thoughts on “設計模式-狀態機模式”