首页 > 代码库 > 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。