一. 举例

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

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

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

结构图如下:

代码如下:

  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. 详解es6 class语法糖中constructor方法和super的作用

    大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...

  2. eShopOnContainers学习系列(一):Swagger的使用

    最近在看eShopOnContainer项目,抽取一下其中的基础知识点,做个记录,有兴趣的可以看下. 新建一个.net core API项目,添加Nuget包 Swashbuckle.AspNetCo ...

  3. Python列表的深度排序

    实例1:>>>L = [2,3,1,4]>>>L.sort()>>>L>>>[1,2,3,4] 实例2:>>> ...

  4. JavaScript系列:函数式编程(开篇)

    前言: 上一篇介绍了 函数回调,高阶函数以及函数柯里化等高级函数应用,同时,因为正在学习JavaScript·函数式编程,想整理一下函数式编程中,对于我们日常比较有用的部分. 为什么函数式编程很重要? ...

  5. python Django中的cookie和session

    目录 Cookie 1.1获取Cookie 1.2设置Cookie Session 1.数据库Session 2.缓存Session 3.文件Session 4.缓存+数据库Session Cooki ...

  6. 快学Scala 第七课 (类构造函数)

    类 主构造器: class Person (var name: String){ } 主构造参数可以不带val或者var,如果没有被其他方法使用,则不保存为字段. 如果被其他方法使用,则被升格为字段, ...

  7. 使用 Chrome 对长网页(知乎、微信公众号文章)进行完整截图

    当需要对一个较长的网页进行完整截图时,可以直接使用谷歌浏览器(Chrome)自带的截图功能完成,不需要依赖第三方截图软件. 1. 打开网页 以微信公众号的页面作为示例:https://mp.weixi ...

  8. dubbo配置负载均衡、集群环境

    再用dubbo作为项目架构的时候,给consumer消费者用nginx提供了负载均衡策略和集群的实现, 但是想了下,consumer再多,但是提供者还是一个,最后还不都是落到了这一个provider上 ...

  9. 为了给女朋友买件心怡内衣,我用Python爬虫了天猫内衣售卖数据

    真爱,请置顶或星标 大家好,希望各位能怀着正直.严谨.专业的心态观看这篇文章.ヾ(๑╹◡╹)ノ" 接下来我们尝试用 Python 抓取天猫内衣销售数据,并分析得到中国女性普遍的罩杯数据.最受 ...

  10. Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器

    这是 Java 爬虫系列博文的第四篇,在上一篇 Java 爬虫遇上数据异步加载,试试这两种办法! 中,我们从内置浏览器内核和反向解析法两个角度简单的聊了聊关于处理数据异步加载问题.在这篇文章中,我们简 ...