设计模式-状态模式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判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题,它通过扩展子类实现了条件的判断处理。

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