在组件构件的过程中,某些对象的状态经常变化,如何对这些变化进行有效的管理,同时维持高层模块的稳定。
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对象,从而节省对象开销。