一. 举例

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

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

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

结构图如下:

代码如下:

  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. redis-公平信号量

    但各个系统的系统时间并不完全相同时,基本信号量就会出现问题:系统时间较慢的系统,将能够偷走系统时钟快的系统的信号量,导致信号量变得不公平.以下方法,只要系统间时间相差不到1秒,就不会出现信号量被偷或提 ...

  2. invalid comparison: java.util.ArrayList and java.lang.String解决

    报错: Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause ...

  3. Python简单的抓取静态网页内容

    import requests from bs4 import BeautifulSoup res = requests.get('http://news.sina.com.cn/china/')#获 ...

  4. .Net Core与Vue.js模块化前后端分离快速开发解决方案(NetModular)

    NetModular是什么? NetModular不仅仅是一个框架,它也是一整套的模块化与前后端分离的快速开发的解决方案,目标是致力于开箱即用,让开发人员完全专注于业务开发,不需要关心底层封装和实现. ...

  5. SpringBoot自定义异常,优雅解决业务逻辑中的错误

    概要 你是不是在为业务逻辑中出现的异常弄的焦头烂额,常常在后台报错,前端却无法提示错误内容,导致用户体验极差?比如下单失败,前端只能提示下单失败,但是却不知道为什么失败,是库存不足,还是余额不足,亦或 ...

  6. 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解

    一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...

  7. SpringBoot2+Netty打造通俗简版RPC通信框架(升级版)

    背景         上篇文章我简单的介绍了自己打造的通俗简版RPC通信框架,这篇是对简版的增强~         如果大家对此项目还感兴趣的话,可到码云上瞄瞄:Netty-RPC         上 ...

  8. Eclipse导入别人项目爆红叉

    1.导入项目之前,请确认工作空间编码已设置为utf-8:window->Preferences->General->Wrokspace->Text file encoding- ...

  9. ELK日志分析系统(4)-elasticsearch数据存储

    1. 概述 logstash把格式化的数据发送到elasticsearch以后,elasticsearch负责存储搜索日志数据 elasticsearch的搜索接口还是很强大的,这边不详细展开,因为k ...

  10. 50个实用的jq代码段整理

    个人博客: http://mcchen.club   1. 如何创建嵌套的过滤器:   //允许你减少集合中的匹配元素的过滤器,   //只剩下那些与给定的选择器匹配的部分.在这种情况下,   //查 ...