設計模式之狀態模式

來源:互聯網
上載者:User

標籤: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)語句,且這些分支依賴於該對象的狀態。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.