一、概述
當一個對象內在狀態改變時允許其改變行爲,這個對象看起來像改變了其類。
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判斷語句會導致程序結構不清晰,邏輯混亂,使用狀態模式可以很好地避免這一問題,它通過擴展子類實現了條件的判斷處理。