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
- 23种设计模式(15)--State模式
- 23种设计模式(State模式)
- 设计模式:State模式
- 设计模式--State 模式
- 23种设计模式之状态模式(State)
- 23种设计模式之python实现--State模式
- 23种设计模式(16):状态模式(State)
- 23设计模式之状态模式(State)
- 23设计模式之状态模式(State)
- State模式详解--设计模式(15)
- 设计模式之State
- 设计模式之State
- 设计模式之State
- 设计模式小议:state
- 设计模式之State
- 设计模式之State
- State设计模式
- 设计模式之State
- 利用jacob实现access数据访问
- 最全面的java多线程用法解析
- vickate_iOS_UITextField 的占位符自定义设置
- Box2D C++ 教程-自定义重力
- CodeForces-672C-Recycling Bottles
- 23种设计模式(15)--State模式
- 盘点最实用的大数据可视化分析工具(1/4)
- 跟谷歌学一个多次点击事件的逻辑处理
- Box2D C++ 教程-匀速运动
- >>> FilterDispatcher <<< is deprecated! Please use the new filters!
- 我们应当怎样学习HTML和CSS
- STM32F207 USART+DMA代码+个人理解
- Box2D C++ 教程-旋转到指定角度
- NYOJ 92 图像有用区域