意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用情形:
1) 一个对象的行为取决于它的状态,并且它必须在运行时刻改变它的状态。
2) 一个操作中含有庞大的多分支条件语句,且这些分支依赖于对象的状态。这个状态通常用一个或多个枚举常量表示。State模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象,然后执行相关的操作。
效果:
1) 将不同状态的行为分割开来,方便于实现
2) state对象可以被共享
3) 使得状态转换显示化(需要清楚知道状态转换的条件,如增加对象的话,就需要调整转换逻辑)
典型例子:
如对象的状态处理机,先经历start状态,然后到PreProcess状态(预处理),再到Process状态,最后到end状态。其中某个环节出错了都可能直接跳转到end状态。
UML图:
代码示例(伪代码):
class Context { public: void changeState(State *state){ if(state) {delete state;} state= new State(); //或者使用单例,这时不需要释放 } private: State*state; }; class AbstractState() { public: void handle(Context *) = 0; }; class StartState(): public AbstractState { public: //在处理中会切换状态,如context->changeState(new PreProcess ()); void handle(Context *context) { …} }; class EndState(): public AbstractState { public: void handle(Context *) { …}; } class PreProcessState; //代码同前 class ProcessState; //处理时 void Request() { //伪代码而言,取决于实际实现的判断 while(typeinfo(state).name()!= “EndState”) state->handle(this); }
p.s:如果Context实现为单例且state是public成员,这时候状态的处理无需传入Context指针,可以通过类的getInstance方法直接获取指针进行状态转换。