1. 定义
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
2. 适用场景
- 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
- 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
3. 要点总结
- State模式将所有与一个特定状态相关的行为放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的一一即要么彻底转换过来,要么不转换。
- 如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。
4. Demo
4.1 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(){
}
};
4.2 引入State
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;
//...
}
};
本专栏文章:
- 01-C++面向对象设计原则
- 02-C++模式概述
- 03-模板方法(Template Method)
- 04-策略模式(Strategy)
- 05-观察者模式(Observer)
- 06-装饰模式(Decorator)
- 07-桥模式(Bridge)
- 08-工厂方法(Factory Method)
- 09-抽象工厂(Abstract Factory)
- 10-原型模式(Prototype)
- 11-构建器(Builder)
- 12-单件模式(Singleton)
- 13-享元模式(Flyweight)
- 14-门面模式(Façade)
- 15-代理模式(Proxy)
- 16-适配器(Adapter)
- 17-中介者(Mediator)
- 18-状态模式(State)
- 19-备忘录(Memento)
- 20-组合模式(Composite)
- 21-迭代器(Iterator)
- 22-职责链(Chain of Resposibility)
- 23-命令模式(Command)
- 24-访问器(Visitor)
- 25-解析器(Interpreter)
- 26-C++设计模式总结