設計模式——狀態模式(state)

在組件構件的過程中,某些對象的狀態經常變化,如何對這些變化進行有效的管理,同時維持高層模塊的穩定。

state,memento屬於狀態變化類別的設計模式。

motivation:在軟件構件過程中,某些對象的狀態發生變化,其行爲也相應發生變化;如何在運行時根據對象狀態來透明更改對象行爲,而不會在對象狀態和操作之間引入緊耦合。

key interface or class:

        1. state接口,不同狀態下實現該接口。

feature: 狀態實例化。

structure:

template codes:

//狀態發生變化的對象
enum NetWorkStatus
{
    network_open,
    network_connect,
    network_closed
}

class NetWorkProcess{
private:
    NetWorkStatus status;
public:
    void operation1(){
        if(status == network_open){
            //該狀態下操作,並將狀態改變
            status = network_closed;
        }
        else if(status == network_connect){
            //該狀態下操作,並將狀態改變
            status = network_open;
        }
        else if(status == network_closed){
            //該狀態下操作,並將狀態改變
            status = network_connect;
        }    
    }

    void operation2(){
        if(status == network_open){
            //該狀態下操作,並將狀態改變
            status = network_connect;
        }
        else if(status == network_connect){
            //該狀態下操作,並將狀態改變
            status = network_closed;
        }
        else if(status == network_closed){
            //該狀態下操作,並將狀態改變
            status = network_open;
        } 
    }

    void operation3(){
        //...
    }
}

//如果增加一個NetWorkState狀態,則operation中需要增加if分支,改動較大
//將狀態作爲基類接口

class NetWorkStatus{
public:
    NetWorkState* nextState;
    virtual void operation1()=0;
    virtual void operation2()=0;
    virtual void operation3()=0;

    virtual ~ NetWorkStatus(){}
}

class OpenStatus: public NetWorkStatus
{
private:
    NetWorkStatus* m_instance;
public:
    static getInstance(){
        //使用單例模式獲得實例
    }
    
    virtual void operation1(){
        //相應操作
        //設定下一狀態
        nextState = CloseStatus::getInstance();    
    }
    virtual void operation2(){
        //相應操作
        //設定下一狀態
        nextState = CloseStatus::getInstance();    
    }    
    virtual void operation3(){
        //相應操作
        //設定下一狀態
        nextState = CloseStatus::getInstance();    
    }

}

//調用
class NetWorkProcess{
private:
    NetWorkStatus* pStatus;
public:
    void operation1(){
        //相關操作
          pStatus->operation1();
          pStatus = pStatus->nextState;
        //相關操作
    }
    void operation2(){
        //相關操作
          pStatus->operation2();
          pStatus = pStatus->nextState;
        //相關操作
    }
    void operation3(){
        //相關操作
          pStatus->operation3();
          pStatus = pStatus->nextState;
        //相關操作
    }



summary:

1. state模式將與一個狀態有關的行爲,放在status類的該狀態子類中,在狀態切換時切換子類;實現具體操作與狀態之間的解耦;

2.爲不同狀態引入不同對象,使得狀態轉換更加明確;而且保證不會出現狀態不一致的情況,因爲狀態轉換具有原子性;

3.如果state對象沒有實例變量,上下文可以共享一個state對象,從而節省對象開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章