設計模式-狀態機模式

狀態機模式(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 類圖(取自維基百科):

state_design_pattern_uml_class_diagram-svg
狀態機模式UML

state-pattern-animation

1 thoughts on “設計模式-狀態機模式

發表留言