狀態模式:當一個對象的內在狀態改變時,允許改變其行為,這個對象看起來像是改變了其類。 狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。 下麵舉例說明,假設有兩種狀態需要轉換,每請求一次就轉換一次狀態: ...
狀態模式:當一個對象的內在狀態改變時,允許改變其行為,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。
下麵舉例說明,假設有兩種狀態需要轉換,每請求一次就轉換一次狀態:
首先定義狀態介面和兩個具體的狀態
/// <summary> /// 抽象狀態類,規定不同狀態下共同的方法定義 /// 將特定的狀態行為都放入一個具體的狀態對象中,由於所有與狀態相關的代碼都存在於某個具體狀態類中, /// 所以可以通過定義新的子類可以很容易地增加新的狀態和轉換 /// </summary> abstract class State { public abstract void Handle(Context context); } /// <summary> /// 在每個具體的狀態內完成該狀態下需要執行的具體操作 /// </summary> class StateA : State { public override void Handle(Context context) { Console.WriteLine("當前狀態為StateA"); context.State = new StateB(); Console.WriteLine("切換為StateB"); } } class StateB : State { public override void Handle(Context context) { Console.WriteLine("當前狀態為StateB"); context.State = new StateA(); Console.WriteLine("切換為StateA"); } }
下麵定義一個上下文對象,該對象中存在一個狀態屬性
class Context { public State State { get; set; } public Context(State state) { this.State = state; } /// <summary> /// 進行當前狀態需要執行的操作 /// </summary> public void Request() { State.Handle(this); } }
客戶端執行請求,實現狀態切換
//設置當前初始狀態 Context context = new Context(new StateA()); //執行該狀態下的操作,有可能會在操作中發生狀態的轉換 context.Request(); context.Request(); context.Request(); context.Request();
執行結果為:
當前狀態為StateA
切換為StateB
當前狀態為StateB
切換為StateA
當前狀態為StateA
切換為StateB
當前狀態為StateB
切換為StateA
可見,總共四次請求,狀態也切換了4次
狀態模式的好處是將與特定狀態相關的行為局部化,並將不同狀態的行為分隔開來,通過把各種狀態轉移邏輯到State的字類中,從而消除龐大的條件分支語句,減少相互間的依賴。當一個對象的行為取決於它的狀態,並且它必須在運行時根據狀態改變它的行為時,就可以考慮使用狀態模式。