C++设计模式|C++设计模式 - 状态模式(State)
状态变化模式
- 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
- State
- Memento
- 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
- 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
结构
文章图片
要点总结
- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象; 但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况 ,因为转换是原子性的一即要么彻底转换过来,要么不转换。
- 如果State对象没有实例变量,那么各个.上下文可以共享同一个State对象,从而节省对象开销。
【C++设计模式|C++设计模式 - 状态模式(State)】可以把state和Strateg看成同一种模式,就是出现问题:if-else,枚举。该怎末转?用多态的方式实现运行时的改变,具体是什么模式在开发过程中没那么重要。
if-else
enum NetworkState
{
Network_Open,
Network_Close,
Network_Connect,
};
class NetworkProcessor{NetworkState state;
public:void Operation1(){
if (state == Network_Open){//**********
state = Network_Close;
}
else if (state == Network_Close){//..........
state = Network_Connect;
}
else if (state == Network_Connect){//$$$$$$$$$$
state = Network_Open;
}
}public void Operation2(){if (state == Network_Open){//**********
state = Network_Connect;
}
else if (state == Network_Close){//.....
state = Network_Open;
}
else if (state == Network_Connect){//$$$$$$$$$$
state = Network_Close;
}}public void Operation3(){}
};
多态,运行时的if-else
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;
//...
}
};
推荐阅读
- C++设计模式|C++设计模式 - 备忘录模式(Memento)
- C++控制结构详情
- C++实现简单的计算器功能
- 笔记|工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++实现
- nacos 服务状态监听
- C++ STL Merge的用法
- c++|虚函数和多态性
- 面经|美团后端一二面c++
- 图书管理系统简易版C++
- 一起来学习C++的函数指针和函数对象