状态(state)模式

意图:this

容许一个对象在其内部状态改变时改变它的行为。对象看起来彷佛修改了它的类。指针

适用情形:code

1)      一个对象的行为取决于它的状态,而且它必须在运行时刻改变它的状态。对象

2)      一个操做中含有庞大的多分支条件语句,且这些分支依赖于对象的状态。这个状态一般用一个或多个枚举常量表示。State模式将每个条件分支放入一个独立的类中,这使得你能够根据对象自身的状况将对象的状态做为一个对象,而后执行相关的操做。get

效果:class

1)      将不一样状态的行为分割开来,方便于实现方法

2)      state对象能够被共享im

3)      使得状态转换显示化(须要清楚知道状态转换的条件,如增长对象的话,就须要调整转换逻辑)img

典型例子:while

         如对象的状态处理机,先经历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方法直接获取指针进行状态转换。

相关文章
相关标签/搜索