1. #ifndef __STATE_H__
  2. #define __STATE_H__
  3.  
  4. #include <iostream>
  5. #include<stdlib.h>
  6. using namespace std;
  7. class GumballMachine;
  8.  
  9. class State
  10. {
  11. public:
  12. State();
  13. virtual ~State();
  14. virtual void insertQuarter();
  15. virtual void ejectQuarter();
  16. virtual void turnCrank();
  17. virtual void dispense();
  18. };
  19.  
  20. class NoQuarterState : public State
  21. {
  22. private:
  23. GumballMachine *gumballmachine;
  24. public:
  25. NoQuarterState(GumballMachine *g);
  26. virtual ~NoQuarterState();
  27. virtual void insertQuarter();
  28. virtual void ejectQuarter();
  29. virtual void turnCrank();
  30. virtual void dispense();
  31.  
  32. };
  33.  
  34. class SoldOutState :public State
  35. {
  36. private:
  37. GumballMachine *gumballmachine;
  38. public:
  39. SoldOutState(GumballMachine *g);
  40. virtual ~SoldOutState();
  41. virtual void insertQuarter();
  42. virtual void ejectQuarter();
  43. virtual void turnCrank();
  44. virtual void dispense();
  45. };
  46.  
  47. class HasQuarterState :public State
  48. {
  49. private:
  50. GumballMachine *gumballmachine;
  51. public:
  52. HasQuarterState(GumballMachine *g);
  53. virtual ~HasQuarterState();
  54. virtual void insertQuarter();
  55. virtual void ejectQuarter();
  56. virtual void turnCrank();
  57. virtual void dispense();
  58. };
  59.  
  60. class SoldState :public State
  61. {
  62. private:
  63. GumballMachine *gumballmachine;
  64. public:
  65. SoldState(GumballMachine *g);
  66. virtual ~SoldState();
  67. virtual void insertQuarter();
  68. virtual void ejectQuarter();
  69. virtual void turnCrank();
  70. virtual void dispense();
  71. };
  72.  
  73. class WinnerState :public State
  74. {
  75. private:
  76. GumballMachine *gumballmachine;
  77. public:
  78. WinnerState(GumballMachine *g);
  79. virtual ~WinnerState();
  80. virtual void insertQuarter();
  81. virtual void ejectQuarter();
  82. virtual void turnCrank();
  83. virtual void dispense();
  84. };
  85.  
  86. #endif
  1. #include "State.h"
  2. #include "GumballMachine.h"
  3. void State::dispense()
  4. {
  5.  
  6. }
  7.  
  8. void State::turnCrank()
  9. {
  10.  
  11. }
  12.  
  13. void State::ejectQuarter()
  14. {
  15.  
  16. }
  17.  
  18. void State::insertQuarter()
  19. {
  20.  
  21. }
  22.  
  23. State::~State()
  24. {
  25.  
  26. }
  27.  
  28. State::State()
  29. {
  30.  
  31. }
  32. NoQuarterState::~NoQuarterState()
  33. {
  34.  
  35. }
  36.  
  37. NoQuarterState::NoQuarterState(GumballMachine *g)
  38. {
  39. gumballmachine = g;
  40. }
  41.  
  42. void NoQuarterState::dispense()
  43. {
  44. cout << "You need to pay first." << endl;
  45. }
  46.  
  47. void NoQuarterState::turnCrank()
  48. {
  49. cout << "You turned, but there is no quarter." << endl;
  50. }
  51.  
  52. void NoQuarterState::ejectQuarter()
  53. {
  54. cout << "You has not insert quarter." << endl;
  55. }
  56.  
  57. void NoQuarterState::insertQuarter()
  58. {
  59. cout << "You insert a quarter." << endl;
  60. gumballmachine->SetState(gumballmachine->GetHasQuarterState());
  61. }
  62.  
  63. void SoldOutState::dispense()
  64. {
  65. cout << "Sold out." << endl;
  66. }
  67.  
  68. void SoldOutState::turnCrank()
  69. {
  70. cout << "Sold out, there is no quarter." << endl;
  71. }
  72.  
  73. void SoldOutState::ejectQuarter()
  74. {
  75. cout << "Sold out, can't eject quarter." << endl;
  76. }
  77.  
  78. void SoldOutState::insertQuarter()
  79. {
  80. cout << "Sold out, You can't insert a quarter." << endl;
  81. }
  82.  
  83. SoldOutState::~SoldOutState()
  84. {
  85.  
  86. }
  87.  
  88. SoldOutState::SoldOutState(GumballMachine *g)
  89. {
  90. gumballmachine = g;
  91. }
  92.  
  93. void HasQuarterState::dispense()
  94. {
  95. cout << "No gum ball dispensed." << endl;
  96. }
  97.  
  98. void HasQuarterState::turnCrank()
  99. {
  100. cout << "You turned." << endl;
  101. int winner = (rand() % 10);
  102. if (winner == 0 && gumballmachine->getCount() > 1)
  103. {
  104. gumballmachine->SetState(gumballmachine->GetWinnerState());
  105. }
  106. else
  107. {
  108. gumballmachine->SetState(gumballmachine->GetSoldState());
  109. }
  110. }
  111.  
  112. void HasQuarterState::ejectQuarter()
  113. {
  114. cout << "Quarter returned." << endl;
  115. gumballmachine->SetState(gumballmachine->GetNoQuarterState());
  116. }
  117.  
  118. void HasQuarterState::insertQuarter()
  119. {
  120. cout << "You can't insert another quarter." << endl;
  121. }
  122.  
  123. HasQuarterState::~HasQuarterState()
  124. {
  125.  
  126. }
  127.  
  128. HasQuarterState::HasQuarterState(GumballMachine *g)
  129. {
  130. gumballmachine = g;
  131. }
  132.  
  133. void SoldState::dispense()
  134. {
  135. gumballmachine->releaseBall();
  136. if (gumballmachine->getCount() > 0)
  137. {
  138. gumballmachine->SetState(gumballmachine->GetNoQuarterState());
  139. }
  140. else
  141. {
  142. cout << "Oops, out of gum balls!" << endl;
  143. gumballmachine->SetState(gumballmachine->GetSoldOutState());
  144. }
  145. }
  146.  
  147. void SoldState::turnCrank()
  148. {
  149. cout << "Turning twice does not get you another gum ball." << endl;
  150. }
  151.  
  152. void SoldState::ejectQuarter()
  153. {
  154. cout << "Sorry, you already turned the crank." << endl;
  155. }
  156.  
  157. void SoldState::insertQuarter()
  158. {
  159. cout << "Please wait, we are already giving you a gum ball." << endl;
  160. }
  161.  
  162. SoldState::~SoldState()
  163. {
  164.  
  165. }
  166.  
  167. SoldState::SoldState(GumballMachine *g)
  168. {
  169. gumballmachine = g;
  170. }
  171.  
  172. void WinnerState::dispense()
  173. {
  174. cout << "YOU ARE A WINNER, You get two gum balls." << endl;
  175. gumballmachine->releaseBall();
  176. if (gumballmachine->getCount() == 0)
  177. {
  178. gumballmachine->SetState(gumballmachine->GetSoldOutState());
  179. }
  180. else
  181. {
  182. gumballmachine->releaseBall();
  183. if (gumballmachine->getCount() == 0)
  184. {
  185. gumballmachine->SetState(gumballmachine->GetSoldOutState());
  186. }
  187. else
  188. {
  189. gumballmachine->SetState(gumballmachine->GetNoQuarterState());
  190. }
  191. }
  192. }
  193.  
  194. void WinnerState::turnCrank()
  195. {
  196. cout << "Turning twice does not get you another gum ball." << endl;
  197. }
  198.  
  199. void WinnerState::ejectQuarter()
  200. {
  201. cout << "Sorry, you already turned the crank." << endl;
  202. }
  203.  
  204. void WinnerState::insertQuarter()
  205. {
  206. cout << "Please wait, we are already giving you a gum ball." << endl;
  207. }
  208.  
  209. WinnerState::~WinnerState()
  210. {
  211.  
  212. }
  213.  
  214. WinnerState::WinnerState(GumballMachine *g)
  215. {
  216. gumballmachine = g;
  217. }
  1. #ifndef __GUMBALLMACHINE_H__
  2. #define __GUMBALLMACHINE_H__
  3. #include "State.h"
  4. #include <iostream>
  5. #include<stdlib.h>
  6. using namespace std;
  7. //class State;
  8. class GumballMachine
  9. {
  10. private:
  11. State *soldOutState;
  12. State *noQuarterState;
  13. State *hasQuarterState;
  14. State *soldState;
  15. State *winnerState;
  16. State *CurrentState;
  17. int Count;
  18. public:
  19. GumballMachine(int num);
  20. ~GumballMachine();
  21.  
  22. void insertQuarter();
  23.  
  24. void ejectQuarter();
  25.  
  26. void turnCrank();
  27.  
  28. void SetState(State *st);
  29.  
  30. State * GetNoQuarterState();
  31.  
  32. State * GetWinnerState();
  33.  
  34. State * GetHasQuarterState();
  35.  
  36. State * GetSoldState();
  37.  
  38. State * GetSoldOutState();
  39. void releaseBall();
  40. int getCount();
  41. };
  42. #endif
  1. #include "GumballMachine.h"
  2.  
  3. int GumballMachine::getCount()
  4. {
  5. return Count;
  6. }
  7.  
  8. void GumballMachine::releaseBall()
  9. {
  10. cout << "A ball comes rolling out the slot." << endl;
  11. if (Count != 0)
  12. {
  13. Count--;
  14. }
  15. }
  16.  
  17. State * GumballMachine::GetSoldOutState()
  18. {
  19. return soldOutState;
  20. }
  21.  
  22. State * GumballMachine::GetSoldState()
  23. {
  24. return soldState;
  25. }
  26.  
  27. State * GumballMachine::GetHasQuarterState()
  28. {
  29. return hasQuarterState;
  30. }
  31.  
  32. State * GumballMachine::GetWinnerState()
  33. {
  34. return winnerState;
  35. }
  36.  
  37. State * GumballMachine::GetNoQuarterState()
  38. {
  39. return noQuarterState;
  40. }
  41.  
  42. void GumballMachine::SetState(State *st)
  43. {
  44. CurrentState = st;
  45. }
  46.  
  47. void GumballMachine::turnCrank()
  48. {
  49. CurrentState->turnCrank();
  50. CurrentState->dispense();
  51. }
  52.  
  53. void GumballMachine::ejectQuarter()
  54. {
  55. CurrentState->ejectQuarter();
  56. }
  57.  
  58. void GumballMachine::insertQuarter()
  59. {
  60. CurrentState->insertQuarter();
  61. }
  62.  
  63. GumballMachine::~GumballMachine()
  64. {
  65.  
  66. }
  67.  
  68. GumballMachine::GumballMachine(int num)
  69. {
  70. Count = num;
  71. soldOutState = new SoldOutState(this);
  72. noQuarterState = new NoQuarterState(this);
  73. hasQuarterState = new HasQuarterState(this);
  74. winnerState = new WinnerState(this);
  75. soldState = new SoldState(this);
  76. if (Count > 0)
  77. {
  78. CurrentState = noQuarterState;
  79. }
  80. }
  1. #include <iostream>
  2. #include "GumballMachine.h"
  3. using namespace std;
  4. int main()
  5. {
  6. GumballMachine *g = new GumballMachine(10);
  7. for (int i = 0; i < 11; i ++)
  8. {
  9. cout << "================================" << endl;
  10. g->insertQuarter();
  11. g->turnCrank();
  12. }
  13. return 0;
  14. }

:状态模式:GumballMachine的更多相关文章

  1. Head First 设计模式 --10 状态模式

    状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类. 用到的设计原则1.封装变化2.多用组合,少用继承3.针对接口编程,不针对实现编程4.松耦合5.对扩展开放,对修改关闭6.依 ...

  2. 《Head First 设计模式》学习笔记——状态模式

    在软件开发过程中.应用程序可能会依据不同的情况作出不同的处理. 最直接的解决方式是将这些全部可能发生的情况全都考虑到.然后使用if... ellse语句来做状态推断来进行不同情况的处理. 可是对复杂状 ...

  3. C#设计模式之10:状态模式

    状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...

  4. Head First设计模式——状态模式

    糖果机 如下糖果机工作状态图,我们对这个状态图进行编码实现糖果机的工作过程 这个状态图的每个圆圈代表一个状态,可以看到有4个状态同时又4个动作,分别是:“投入1元钱”.“退回1元钱”.“转动曲柄”.“ ...

  5. 《Head First 设计模式》:状态模式

    正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...

  6. StatePattern(状态模式)

    /** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...

  7. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  8. php实现设计模式之 状态模式

    <?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...

  9. Java 策略模式和状态模式

    本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...

  10. javascript - 状态模式 - 简化分支判断流程

    状态模式笔记   当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象   状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...

随机推荐

  1. Program Option Modifiers

    Some option are 'boolean' and control behavior that can be turned on or off. --column-names option d ...

  2. week02 课堂作业

    测试一:(点此看原题目) 运行结果: 测试二:(点此看原题目) 运行结果: 测试三:(点此看原题目) 运行结果:

  3. 安卓中使用HttpURLConnection连接网络简单示例 --Android网络编程

    MainActivity.java: package thonlon.example.cn.httpurlconnectionpro; import android.os.Bundle;import ...

  4. ssd制作数据和训练

    1.在/data/VOCdevkit下建立自己的数据集名称如MyDataSet,在MyDataSet目录下需包含Annotations.ImageSets.JPEGImages三个文件夹: 2.Ima ...

  5. pre打印

    echo "<pre>";print_r(var);echo "</pre>";

  6. HDU 5710 Digit Sum

    Let S(N)S(N) be digit-sum of NN, i.e S(109)=10,S(6)=6S(109)=10,S(6)=6. If two positive integers a,ba ...

  7. Appium移动自动化测试(一)----Appium的安装

    前言: 我的环境为win10 64,安装过程请根据自己的电脑环境而定. 一.Appium安装 1.Appium官方网站:http://appium.io/下载windows版本的Appium; Eas ...

  8. JavaScript工具函数集

    /** * [getQueryStringArgs 用以解析查询字符串] * @return {[Object]} [一个包含所有参数的对象] */ function getQueryStringAr ...

  9. 51Nod 1001 数组中和等于K的数对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1001一开始的想法是排序后二分搜索,发现会进行非常多不必要的遍历,十分耗时 ...

  10. Git:创建远程仓库并推送内容到远程库

    1.添加远程仓库 1.1点击该按钮创建一个新仓库 2.推送到远程仓库 2.1根据GitHub的提示,在本地的learngit仓库下运行命令git remote add origin https://g ...