首頁 » 設計模式 » 狀態(State)

狀態(State)

作者:

分類:

狀態(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,隨著系統越寫越大就會變得難以招架,這時狀態模式會是個好的解決方法。

以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

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