設計模式-狀態模式State(對象行爲型)

一、概述

當一個對象內在狀態改變時允許其改變行爲,這個對象看起來像改變了其類。

State爲抽象狀態角色,負責對象狀態定義,並且封裝環境角色以實現狀態切換

ConcreteState爲具體狀態角色,負責本狀態的行爲管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。

Context爲環境角色,定義客戶端需要的接口,並且負責具體狀態的切換。

//test.h
class Context
{
public:
    Context()
    {
        m_pCurState = CloseState::Instance;
    }
    void SetCurrentState(State* pCurState)
    {
        m_pCurState = pCurState;
    }

    void Open()
    {
        m_pCurState.Open();
    }
    void Close()
    {
        m_pCurState.Close();
    }
private:
    friend class State;
    State* m_pCurState;
};

class State
{
public:
    virtual void Open(Context* pContext);
    virtual void Close(Context* pContext);
    
protected:
    void ChangeState(Context* pContext,State* pNewState)
    {
        pContext->SetCurrentState(pNewState);
    }
}

class OpenState: public State
{
public:
    static State* Instance();
public:
    virtual void Open(Context* pContext)
    {
        cout<<"already open"<<endl;
    }
    virtual void Close(Context* pContext)
    {
        cout<<"do close"<<endl;
        ChangeState(pContext,CloseState::Instance());
    }
}

class CloseState : public State
{
public:
    static State* Instance();
public:
    virtual void Open(Context* pContext)
    {
        cout<<"do open"<<endl;
        ChangeState(pContext,OpenState::Instance());
    }
    virtual void Close(Context* pContext)
    {
        cout<<"already close"<<endl;
    }
}

void main()
{
    Context* pContext = new Context;
    pContext.Open();
    pContext.Close();
}

二、使用場景

(1)行爲隨狀態改變而改變的場景,例如TCP連接的狀態變化及操作,權限設計等

(2)條件、分支判斷語句的替代者

在程序中大量使用switch語句或者if判斷語句會導致程序結構不清晰,邏輯混亂,使用狀態模式可以很好地避免這一問題,它通過擴展子類實現了條件的判斷處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章