狀態(state)模式

意圖: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方法直接獲取指針進行狀態轉換。

相關文章
相關標籤/搜索