狀態模式(State):當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於復雜的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的判斷邏輯簡化。當然,如果這個狀態判斷很簡單,那麼就沒必要用‘狀態模式’了。
狀態模式結構圖:
相關類的解釋及代碼:
State類,抽象狀態類,定義一個接口以封裝與Context的一個特定狀態相關的行為。
class State
{
public:
virtual void Handle(Context *pcontext)=0;
};
ConcreteState類,具體狀態,每個子類實現一個與Context的一個狀態相關的行為。
class ConcreteStateA : State
{
public:
void Handle(Context * pcontext)
{
pcontext->state= newConcreteStateB(); //設置ConcreteStateA的下一個、//態是ConcreteStateB
}
};
class ConcreteStateB : State
{
public:
void Handle(Context * pcontext)
{
pcontext->state= newConcreteStateA(); //設置ConcreteStateA的下一狀、//態是CincreteStateB
}
};
Context類,維護一個ConcreteState子類的實例,這個實例定義當前的狀態
class Context
{
private:
State *state;
public:
Context(State *state)
{
this->state=state;
}
void setState(State *state)
{
this->state=state;
}
State * getState()
{
return this->state;
}
void Request() //對請求做處理,並設置下一狀態
{
state->Handle(this);
}
};
客戶端代碼:
void main()
{
Context *pc=new Context(new ConcreteStateA()); //設置Context的初始狀態為//ConcreteStateA
pc->Request();
pc->Request(); //不斷的請求,同時更改狀態
pc->Request();
}
接下來請看第2頁精彩內容:http://www.linuxidc.com/Linux/2013-10/90906p2.htm