state.h

  1. #ifndef _STATE_H_
  2. #define _STATE_H_
  3.  
  4. class GumballMachine;
  5.  
  6. class State {
  7. public:
  8. virtual void insert_quarter() = ;
  9. virtual void eject_quarter() = ;
  10. virtual void turn_crank() = ;
  11. virtual void dispense() = ;
  12. State( GumballMachine &_gumball_machine ) : gumball_machine (_gumball_machine ) {}
  13. protected:
  14. GumballMachine &gumball_machine;
  15. };
  16. #endif

gumball_machine.h

说明:这里之所有要把SoldOutState等状态定义在GumballMachine类之中是因为两者之间有相互的依赖,暂时没有想到其他的解决方法。

  1. #ifndef _GUMBALL_MACHINE_H_
  2. #define _GUMBALL_MACHINE_H_
  3. #include <iostream>
  4. #include "state.h"
  5.  
  6. class GumballMachine {
  7. private:
  8. class SoldOutState : public State {
  9. public:
  10. SoldOutState( GumballMachine &_gumball_machine ) : State(_gumball_machine) {}
  11. void insert_quarter() {
  12. std::cout << "You can't insert a quarter, the machine is sold out" << std::endl;
  13. }
  14. void eject_quarter() {
  15. std::cout << "you can't eject, you haven't inserted a quarter yet" << std::endl;
  16. }
  17. void turn_crank() {
  18. std::cout << "You turned, but there's no gumballs" << std::endl;
  19. }
  20. void dispense() {
  21. std::cout << "No gumball dispensed" << std::endl;
  22. }
  23. };
  24.  
  25. class NoQuarterState : public State {
  26. public:
  27. NoQuarterState( GumballMachine &_gumball_machine ): State(_gumball_machine) {}
  28. void insert_quarter() {
  29. std::cout << "You inserted a quarter" << std::endl;
  30. gumball_machine.set_state( gumball_machine.get_has_quarter_state() );
  31. }
  32. void eject_quarter() {
  33. std::cout << "You haven't inserted a quarter" << std::endl;
  34. }
  35. void turn_crank() {
  36. std::cout << "You turned, but there's no quarter" << std::endl;
  37. }
  38. void dispense() {
  39. std::cout << "You need to pay first" << std::endl;
  40. }
  41. };
  42.  
  43. class HasQuarterState : public State {
  44. public:
  45. HasQuarterState( GumballMachine & _gumball_machine ) : State(_gumball_machine) {}
  46. void insert_quarter() {
  47. std::cout << "You can't insert another quarter" << std::endl;
  48. }
  49. void eject_quarter() {
  50. std::cout << "Quarter returned" << std::endl;
  51. gumball_machine.set_state( gumball_machine.get_no_quarter_state() );
  52. }
  53. void turn_crank() {
  54. std::cout << "You turned..." << std::endl;
  55. gumball_machine.set_state( gumball_machine.get_sold_state() );
  56. }
  57. void dispense() {
  58. std::cout << "No gumball dispensed" << std::endl;
  59. }
  60. };
  61. class SoldState : public State {
  62. public:
  63. SoldState( GumballMachine &_gumball_machine ) : State(_gumball_machine) {}
  64. void insert_quarter() {
  65. std::cout << "Please wait, we're already giving you a gumball" << std::endl;
  66. }
  67. void eject_quarter() {
  68. std::cout << "Sorry, you already turned the crank" << std::endl;
  69. }
  70. void turn_crank() {
  71. std::cout << "Turning twice doesn't get you another gumball!" << std::endl;
  72. }
  73. void dispense() {
  74. gumball_machine.release_ball();
  75. if ( == gumball_machine.get_count() ) {
  76. gumball_machine.set_state( gumball_machine.get_sold_out_state() );
  77. }
  78. else {
  79. gumball_machine.set_state( gumball_machine.get_no_quarter_state() );
  80. }
  81. }
  82. };
  83.  
  84. SoldOutState sold_out_state;
  85. NoQuarterState no_quarter_state;
  86. HasQuarterState has_quarter_state;
  87. SoldState sold_state;
  88. State *state;
  89. unsigned count;
  90. public:
  91. GumballMachine( unsigned _count ) :
  92. count(_count),
  93. sold_out_state( *this ),
  94. no_quarter_state( *this ),
  95. has_quarter_state( *this ),
  96. sold_state( *this ) {
  97. if ( == count ) {
  98. state = &sold_out_state;
  99. }
  100. else {
  101. state = &no_quarter_state;
  102. }
  103. }
  104. void release_ball() {
  105. std::cout << "A gumball comes rolling out the slot" << std::endl;
  106. count--;
  107. if ( == count ) {
  108. std::cout << "Oops, out of gumballs!" << std::endl;
  109. }
  110. }
  111. unsigned get_count() { return count; }
  112. void insert_quarter() { state->insert_quarter(); }
  113. void eject_quarter() { state->eject_quarter(); }
  114. void turn_crank() { state->turn_crank(); state->dispense(); }
  115. void set_state( State *_state ) { state = _state; }
  116. State *get_sold_out_state() { return &sold_out_state; }
  117. State *get_no_quarter_state() { return &no_quarter_state; }
  118. State *get_has_quarter_state() { return &has_quarter_state; }
  119. State *get_sold_state() { return &sold_state; }
  120. };
  121. #endif

main.cpp

  1. #include "gumball_machine.h"
  2.  
  3. int main() {
  4. GumballMachine gumball_machine();
  5.  
  6. gumball_machine.insert_quarter();
  7. gumball_machine.eject_quarter();
  8. gumball_machine.insert_quarter();
  9. gumball_machine.turn_crank();
  10.  
  11. gumball_machine.insert_quarter();
  12. gumball_machine.eject_quarter();
  13. gumball_machine.insert_quarter();
  14. gumball_machine.turn_crank();
  15.  
  16. gumball_machine.insert_quarter();
  17. gumball_machine.eject_quarter();
  18. gumball_machine.insert_quarter();
  19. gumball_machine.turn_crank();
  20. return ;
  21. }

Headfirst设计模式的C++实现——状态模式(State)的更多相关文章

  1. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---状态模式[转]

    {没有应用状态模式的代码} //工程文件 program Project1; {$APPTYPE CONSOLE} uses  uGumballMachine in 'uGumballMachine. ...

  2. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  6. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

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

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  8. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  9. 设计模式(java)--状态模式

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

随机推荐

  1. poj 2251 搜索

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13923   Accepted: 5424 D ...

  2. [转]SpringMVC日期类型转换问题三大处理方法归纳

    http://blog.csdn.net/chenleixing/article/details/45190371 前言 我们在SpringMVC开发中,可能遇到比较多的问题就是前台与后台实体类之间日 ...

  3. Windows Server 2012网卡Teaming模式

    成组模式: Switch-independent(交换机独立): 这是配置时的默认值,此模式不要求交换机参与组合配置,由于独立模式下的交换机不知道网卡是主机上组合一部分,teaming组中的网卡可以连 ...

  4. node.js在windows下的学习笔记(4)---同步,异步,回调的概念

    Node.js是使用事件驱动的,非阻塞的I/O模型,用于构建快速的,可扩展的网络应用程序. Node.js想解决的问题是:处理输入,输入,高并发 1.阻塞与非阻塞 阻塞也叫同步,是指每一次执行一个操作 ...

  5. android 删除文件以及递归删除文件夹

    private void deleteDirectory(File file) { if (file.isFile()) { file.delete(); return; } if(file.isDi ...

  6. iOS UIView 基本属性用法

    .创建UIView UIView * redView = [[UIView alloc] initWithFrame:CGRectMake(, , , )]; UIView * blueView = ...

  7. yum、RPM常用的命令(转)

    # yum install xxx            安装xxx软件# yum info xxx                查看xxx软件的信息# yum remove xxx         ...

  8. Linux dd——备份命令

    Linux学习笔记之备份命令dd 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换.可以用该命令实现DOS下的diskcopy命令的作用.先用dd命令把软盘上的数据写成硬 ...

  9. 将项目添加到Finder侧边栏和工具栏

    转: http://www.cnblogs.com/wormday/archive/2011/05/08/2039468.html 1.在侧边栏和工具栏右键,有相应的设置选项 2.可以将项目拖到侧边栏 ...

  10. linux剪切拷贝

    1.剪切 mv rename.sh  ../rename.sh  把这个文件移到上一级目录下 mv rename.sh ./pic/rename.sh 把这个文件移到 当前目录下的pic目录下,并改名 ...