標籤:style class blog code ext get
狀態模式:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。
一個對象的行為取決於一個或多個動態變化的屬性,這樣的屬性叫做狀態,這樣的對象叫做有狀態的(stateful)對象,這樣的對象狀態是從事先定義好的一系列值中取出的。當一個這樣的對象與外來事件產生互動時,其內部狀態就會改變,從而使得系統的行為也隨之發生變化。
組成:
環境類(Context): 它定義了客戶程式需要的介面並維護一個具體狀態角色的執行個體,將與狀態相關的操作委託給當前的Concrete State對象來處理。
抽象狀態類(State):定義一個介面以封裝使用上下文環境的的一個特定狀態相關的行為。
具體狀態類(ConcreteState): 每一子類實現一個與Context的一個狀態相關的行為。
抽象狀態類:
class State{public: virtual void Operation(Context *context) =0;};
環境類:
class Context{public: Context(State* Newstate) { state=Newstate; } void ChangeState(State* NewState) { //改變狀態 if(state!=null)delete state; state=NewState; } void ChangeContext(string NewContext) { //改變環境 ContextName=NewContext; } string GetContext() { return ContextName; } void Operation() { //當前環境下的操作 state->Operation(this); }private: State *state; string ContextName="Context1";//初始環境};
三個具體狀態類:
class State3:public State{public: void Operation(Context* context) { cout<<"State3 Operation"<<endl; }};class State2:public State{public: void Operation(Context* context) { if(context->GetContext()=="Context2") cout<<"State2 Operation"<<endl; else { //不符合目前狀態就轉入下一個狀態 context->ChangeState(new State3()); context->Operation(); } }};class State1:public State{public: void Operation(Context* context) { if(context->GetContext()=="Context1") cout<<"State1 Operation"<<endl; else { //不符合目前狀態就轉入下一個狀態 context->ChangeState(new State2()); context->Operation(); } }};
用戶端操作:
int main(){ Context* context = new Context(new State1());//初始狀態 context->Operation();//State1 Operation context->ChangeContext("Context2");//改變環境 context->Operation();//State2 Operation context->ChangeContext("Context3");//改變環境 context->Operation();//State3 Operation return 0;}
適用範圍:
1)一個對象的行為取決於它的狀態, 並且它必須在運行時刻根據狀態改變它的行為。
2)代碼中包含大量與對象狀態有關的條件陳述式:一個操作中含有龐大的多分支的條件(if else(或switch case)語句,且這些分支依賴於該對象的狀態。