一. 举例

一般汽车发动机工作时有四种状态,吸气、压缩、做功和排气。

在运行时,不同的状态会有不同的行为,当前的状态机在适当的时候会过渡到下一状态。

其实用户在使用时根本不知道当前的状态,也无需知道当前的状态。用户只需要给发动机一个初始状态,最后得到一个停止状态就行了。

结构图如下:

代码如下:

  1. //状态
  2. class State
  3. {
  4. public:
  5. virtual void Operation(Work *work) {}
  6. };
  7. //工作
  8. class Work
  9. {
  10. private:
  11. State *m_state;  //目前状态
  12. int m_step;      //步骤
  13. public:
  14. Work(State *state): m_state(state), m_step(0)
  15. {}
  16. ~Work()
  17. {
  18. delete m_state;
  19. }
  20. int GetStep()
  21. {
  22. return m_step;
  23. }
  24. void SetStep(int step)
  25. {
  26. m_step = step;
  27. }
  28. void SetState(State *state)
  29. {
  30. delete m_state;
  31. m_state = state;
  32. }
  33. void Operation()
  34. {
  35. m_state->Operation(this);
  36. }
  37. };
  38. //排气状态
  39. class ExhaustState: public State
  40. {
  41. public:
  42. void Operation(Work *work)  //排气操作
  43. {
  44. if(work->GetStep() == 4)
  45. {
  46. cout<<"Step : "<<work->GetStep()<<"排气操作"<<endl;
  47. }
  48. }
  49. };
  50. //做功状态
  51. class ActState: public State
  52. {
  53. public:
  54. void Operation(Work *work) //做功操作
  55. {
  56. if(work->GetStep() == 3)
  57. {
  58. cout<<"Step : "<<work->GetStep()<<"做功操作"<<endl;
  59. }
  60. else
  61. {
  62. work->SetState(new ExhaustState());
  63. work->Operation();
  64. }
  65. }
  66. };
  67. //压缩状态
  68. class CompressState: public State
  69. {
  70. public:
  71. void Operation(Work *work) //压缩操作
  72. {
  73. if(work->GetStep() == 2)
  74. {
  75. cout<<"Step : "<<work->GetStep()<<"压缩操作"<<endl;
  76. }
  77. else
  78. {
  79. work->SetState(new ActState());
  80. work->Operation();
  81. }
  82. }
  83. };
  84. //吸气状态
  85. class InhaleState: public State
  86. {
  87. public:
  88. void Operation(Work *work) //吸气操作
  89. {
  90. if(work->GetStep() == 1)
  91. {
  92. cout<<"Step : "<<work->GetStep()<<"吸气操作"<<endl;
  93. }
  94. else
  95. {
  96. State *p = new CompressState();
  97. work->SetState(p);
  98. work->Operation();
  99. }
  100. }
  101. };
  102. //测试代码
  103. int main()
  104. {
  105. State* st = new InhaleState(); //初始状态
  106. Work *work = new Work(st);
  107. for(int i = 1; i < 5; ++i)
  108. {
  109. work->SetStep(i);
  110. work->Operation(); //操作
  111. }
  112. delete work;
  113. return 0;
  114. }

二. 状态模式

定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

结构图:


使用范围:

(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(上面的例子就是这种情况)

(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

设计模式C++描述----16.状态(State)模式的更多相关文章

  1. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  2. Java 实现状态(State)模式

    /** * @author stone */ public class WindowState { private String stateValue; public WindowState(Stri ...

  3. 状态(State)模式--设计模式

    定义与特点 1.1 定义 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 1.2 特点 状态模式优点: 封装了转换规则,并枚举可能的状态,它将所有与某个状 ...

  4. Head First 设计模式 —— 12. 状态 (State) 模式

    思考题 public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; fi ...

  5. 状态(State)模式

    状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的 ...

  6. 设计模式(十九)State模式

    在面向对象编程中,是用类表示对象的.也就是说,程序的设计者需要考虑用类来表示什么东西.类对应的东西可能存在于真实世界中,也可能不存在于真实世界中.对于后者,可能有人看到代码后会感到吃惊:这些东西居然也 ...

  7. 《图解设计模式》读书笔记8-3 STATE模式

    目录 State模式 示例程序 实现的功能 不使用&使用状态模式对比 示例程序的类图 代码 角色和类图 角色 类图 拓展思路 分而治之 依赖于状态的处理 谁来管理状态迁移 易于增加新状态 实例 ...

  8. 设计模式C++描述----22.访问者(Visitor)模式

    一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环 ...

  9. 设计模式C++描述----17.备忘录(Memento)模式

    一. 备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: 使用范围: Memento 模式比较适用于功能 ...

随机推荐

  1. spring系列常用注解

    常见注解使用 - @SpringBootApplication,springboot的核心注解,用于开启自动配置,等效于@Configuraion.@ComponentScan和@EnableAuto ...

  2. Angular 表单嵌套、动态表单

    说明: 组件使用了ng-zorro (https://ng.ant.design/docs/introduce/zh) 第一类:嵌套表单 1. 静态表单嵌套 demo.component.html & ...

  3. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. 夯实Java基础系列23:一文读懂继承、封装、多态的底层实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 从零开始的vue学习笔记(二)

    数据与方法 当一个 Vue 实例被创建时,它将 data 对象中的所有的属性加入到 Vue 的响应式系统中.data的数据和视图同步更新. 实例创建后添加一个新的属性,对这个属性的的改动将不会触发任何 ...

  6. springmvc Controller接收前端参数的几种方式总结

    (1) 普通方式-请求参数名和Controller方法的参数一致 @Controller @RequestMapping("/param") public class TestPa ...

  7. 实验室工作站jupyterhub安装笔记

    本篇文章为实验室工作站的jupyterhub安装配置笔记,由于软硬件等各种区别,安装过程难免有所区别,仅供大家参考. 实验室新到一台深度学习工作站,原本想装一个juoyter notebook直接开干 ...

  8. Aria2 1.35.0,更新,测试,发布

    在上一篇: 有哪些便宜还好用的东西,买了就感觉得了宝一样? 结尾提到了Tatsuhiro Tsujikawa的aria2计划在10月更新一个新的版本 今天趁着雨后明月挂天,开始了简单的更新 虽然在半年 ...

  9. 继续学习freertos消息队列

    写在前面:杰杰这个月很忙~所以并没有时间更新,现在健身房闭馆装修,晚上有空就更新一下!其实在公众号没更新的这段日子,每天都有兄弟在来关注我的公众号,这让我受宠若惊,在这里谢谢大家的支持啦!!谢谢^ 在 ...

  10. day 20

    目录 一.继承初体验 二.寻找继承关系 三.继承背景下对象属性查找顺序 四.派生 五.子类派生出新的属性,并重复父类的属性 六.新式类与经典类(了解) 一.继承初体验 父类: class Parent ...