23种设计模式(15)--State模式

来源:互联网 发布:学网络营销好还是java 编辑:程序博客网 时间:2024/06/14 08:46

state模式是一个状态机,Context类是这个状态机的控制器,状态改变的实现在Context类中,各个状态下的行为也是由Context类来调用,各个状态分别用不同的类实现。state模式的结构图如下:


代码实现:

#include "iostream"using namespace std;class Context;class State{public:virtual void Handle(Context *context) = 0;};class ConcreteState1:public State{public:void Handle(Context *context);};void ConcreteState1::Handle(Context *context){State *state = new ConcreteState2();context->SetState(state);cout<<"ConcreteState1"<<endl;}class ConcreteState2:public State{public:void Handle(Context *context);};void ConcreteState2::Handle(Context *context){State *state = new ConcreteState1();context->SetState(state);cout<<"ConcreteState2"<<endl;}class Context{public:Context(State *state);void Request();void SetState(State *state);private:State *state;};Context::Context(State *state){this->state = state;}void Context::SetState(State *state){this->state = state;}void Context::Request(){State *st = state;state->Handle(this);delete st;}int main(){Context *pContext = new Context(new ConcreteState1());pContext->request();pContext->request();return 0;}

状态模式总结:
(1)状态模式的好处就是将于特定状态相关的行为局部化,并且将不同状态的行为分割开来。即将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。满足对扩展开放,对修改封闭的要求。
(2)这样做的目的是为了消除庞大的条件分支语句,大的分支判断会使得它们难以修改和扩展,状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
(3)当一个对象的行为取决于它们的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。



0 0
原创粉丝点击