C++设计模式之状态模式(状态变化)(State)
1、序论
在组件构建的过程中,某些对象的状态经常会面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
在软件系统构建的过程中,某些对象的状态如果有变化,其行为也会随之而发生变化,比如说文档处于只读的状态,其支持的行为和读写状态的支持的行为就可能完全的不同。
如何在运行时根据对象的状态来透明的更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
模式的定义:
允许一个对象在其内部状态改变时改变它的行为。从而使得对象看起来似乎修改了行为。
2、代理模式的结构类图
3、代码实现(伪代码)
class NetworkState{
public:
NetworkState* pNext;
virtual void Operation1()=0;
virtual void Operation2()=0;
virtual void Operation3()=0;
virtual ~NetworkState(){}
};
class OpenState :public NetworkState{
static NetworkState* m_instance;
public:
static NetworkState* getInstance(){
if (m_instance == nullptr) {
m_instance = new OpenState();
}
return m_instance;
}
void Operation1(){
//**********
pNext = CloseState::getInstance();
}
void Operation2(){
//..........
pNext = ConnectState::getInstance();
}
void Operation3(){
//$$$$$$$$$$
pNext = OpenState::getInstance();
}
};
class CloseState:public NetworkState{ }
//...
class NetworkProcessor{
NetworkState* pState;
public:
NetworkProcessor(NetworkState* pState){
this->pState = pState;
}
void Operation1(){
//...
pState->Operation1();
pState = pState->pNext;
//...
}
void Operation2(){
//...
pState->Operation2();
pState = pState->pNext;
//...
}
void Operation3(){
//...
pState->Operation3();
pState = pState->pNext;
//...
}
};
4、总结
1> 状态模式将所有与一个特定状态相关的行为都方人员一个state的子类对象中,在对象的状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操与状态转化之间的耦合。
2> 为不同的状态引入不同的对象使得状态转化变得更加的明确,而且可以保证不会出现状态不一致的情况,因为转化是原子性的—既要么彻底的转换过来,要么不转换
3> 如果State对象没有实例的变量,那么各个上下文可以共享同一个State对象,从而节省对象的开销。