一、概述
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
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判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题,它通过扩展子类实现了条件的判断处理。