意圖:this
容許一個對象在其內部狀態改變時改變它的行爲。對象看起來彷佛修改了它的類。指針
適用情形:code
1) 一個對象的行爲取決於它的狀態,而且它必須在運行時刻改變它的狀態。對象
2) 一個操做中含有龐大的多分支條件語句,且這些分支依賴於對象的狀態。這個狀態一般用一個或多個枚舉常量表示。State模式將每個條件分支放入一個獨立的類中,這使得你能夠根據對象自身的狀況將對象的狀態做爲一個對象,而後執行相關的操做。get
效果:class
1) 將不一樣狀態的行爲分割開來,方便於實現方法
2) state對象能夠被共享im
3) 使得狀態轉換顯示化(須要清楚知道狀態轉換的條件,如增長對象的話,就須要調整轉換邏輯)img
典型例子:while
如對象的狀態處理機,先經歷start狀態,而後到PreProcess狀態(預處理),再到Process狀態,最後到end狀態。其中某個環節出錯了均可能直接跳轉到end狀態。
UML圖:
代碼示例(僞代碼):
class Context { public: void changeState(State *state){ if(state) {delete state;} state= new State(); //或者使用單例,這時不須要釋放 } private: State*state; }; class AbstractState() { public: void handle(Context *) = 0; }; class StartState(): public AbstractState { public: //在處理中會切換狀態,如context->changeState(new PreProcess ()); void handle(Context *context) { …} }; class EndState(): public AbstractState { public: void handle(Context *) { …}; } class PreProcessState; //代碼同前 class ProcessState; //處理時 void Request() { //僞代碼而言,取決於實際實現的判斷 while(typeinfo(state).name()!= 「EndState」) state->handle(this); }
p.s:若是Context實現爲單例且state是public成員,這時候狀態的處理無需傳入Context指針,能夠經過類的getInstance方法直接獲取指針進行狀態轉換。