状态(state)模式

意图:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

适用情形:

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方法直接获取指针进行状态转换。

原文地址:https://www.cnblogs.com/OpenLinux/p/5020687.html