天天看点

设计模式——状态模式(state)

在组件构件的过程中,某些对象的状态经常变化,如何对这些变化进行有效的管理,同时维持高层模块的稳定。

state,memento属于状态变化类别的设计模式。

motivation:在软件构件过程中,某些对象的状态发生变化,其行为也相应发生变化;如何在运行时根据对象状态来透明更改对象行为,而不会在对象状态和操作之间引入紧耦合。

key interface or class:

        1. state接口,不同状态下实现该接口。

feature: 状态实例化。

structure:

设计模式——状态模式(state)

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对象,从而节省对象开销。

继续阅读