首页 > 代码库 > State状态模式(C++实现)

State状态模式(C++实现)

状态模式状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为。看起来就像是改变了它的类一样。

主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。

类图如下图所示

State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为。
Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。

状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。

可以消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。

     代码如下:State.h

class StateA : public State{public:    virtual void Handle(Context* Context);};class StateB : public State{public:    virtual void Handle(Context* Context);};class StateC : public State{public:    virtual void Handle(Context* Context);};class Context{private:    State* state;public:    Context(){}    Context(State* pState):state(pState){}    ~Context()    {        if(state!=NULL)            delete state;        }    void request();    void changeState(State* pState);};

State.cpp

#include <iostream>#include "State.h"using namespace std;void StateA::Handle(Context* pContext){    cout<<"State A"<<endl;    pContext->changeState(new StateB());}void StateB::Handle(Context* pContext){    cout<<"State B"<<endl;    pContext->changeState(new StateC());}void StateC::Handle(Context* pContext){    cout<<"State C"<<endl;    pContext->changeState(new StateA());}void Context::changeState(State* pState){    if(state!=NULL)        delete state;    state = pState;}void Context::request(){    if(state!=NULL)        state->Handle(this);}

main.cpp

#include <iostream>#include"State.h"using namespace std;int main(){    Context context(new StateA());    for(int i=0;i<6;i++)        context.request();        return 0;}