
狀態(State)
概念
狀態模式是一種行為型模式,會提供新的狀態與執行動作給物件。可說是一種策略模式的變化。
狀態模式的概念與狀態機(State machine)相同,在狀態機實作時常會用if、switch來切換狀態,一旦狀態變多時,這段程式碼就會變得又臭又長。這時應用狀態模式能將各個狀態拆分成獨立類別,只要在動作後時給予新的狀態即可。
在人機介面的情境中,可定義系統目前的狀態,例如某狀態下按鈕的功能,以及按下後下個系統狀態要切去哪。而狀態的動作結果會影響下個狀態是與策略模式之間最主要的差別。
範例
//**************
//* author: cian
//* 20231014
//**************
class Context
{
private State state = new State_Standby();
private void ChangeState(State _state)
{
if (state == null) return;
state = _state;
}
public void StartButton()
{
if (state == null) return;
ChangeState(state.Start());
}
public void StopButton()
{
if (state == null) return;
ChangeState(state.Stop());
}
}
abstract class State
{
public abstract State Start();
public abstract State Stop();
}
/* 狀態: 待命 */
class State_Standby : State
{
public override State Start()
{
Console.WriteLine("System Running...");
return new State_Run();
}
public override State Stop() { return null; } //已停止,不可按。
}
/* 狀態: 運轉 */
class State_Run : State
{
public override State Start() { return null; } //運轉中,不可按。
public override State Stop()
{
Console.WriteLine("System Stopped.");
return new State_Standby();
}
}
結語
過去都寫流程控制居多,很熟悉狀態機的寫法,也就是整台設備的動作寫在一個switch case中,然後case內又一堆if…else,隨著系統越寫越大就會變得難以招架,這時狀態模式會是個好的解決方法。
以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言