state.h

 #ifndef _STATE_H_
#define _STATE_H_ class GumballMachine; class State {
public:
virtual void insert_quarter() = ;
virtual void eject_quarter() = ;
virtual void turn_crank() = ;
virtual void dispense() = ;
State( GumballMachine &_gumball_machine ) : gumball_machine (_gumball_machine ) {}
protected:
GumballMachine &gumball_machine;
};
#endif

gumball_machine.h

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

 #ifndef _GUMBALL_MACHINE_H_
#define _GUMBALL_MACHINE_H_
#include <iostream>
#include "state.h" class GumballMachine {
private:
class SoldOutState : public State {
public:
SoldOutState( GumballMachine &_gumball_machine ) : State(_gumball_machine) {}
void insert_quarter() {
std::cout << "You can't insert a quarter, the machine is sold out" << std::endl;
}
void eject_quarter() {
std::cout << "you can't eject, you haven't inserted a quarter yet" << std::endl;
}
void turn_crank() {
std::cout << "You turned, but there's no gumballs" << std::endl;
}
void dispense() {
std::cout << "No gumball dispensed" << std::endl;
}
}; class NoQuarterState : public State {
public:
NoQuarterState( GumballMachine &_gumball_machine ): State(_gumball_machine) {}
void insert_quarter() {
std::cout << "You inserted a quarter" << std::endl;
gumball_machine.set_state( gumball_machine.get_has_quarter_state() );
}
void eject_quarter() {
std::cout << "You haven't inserted a quarter" << std::endl;
}
void turn_crank() {
std::cout << "You turned, but there's no quarter" << std::endl;
}
void dispense() {
std::cout << "You need to pay first" << std::endl;
}
}; class HasQuarterState : public State {
public:
HasQuarterState( GumballMachine & _gumball_machine ) : State(_gumball_machine) {}
void insert_quarter() {
std::cout << "You can't insert another quarter" << std::endl;
}
void eject_quarter() {
std::cout << "Quarter returned" << std::endl;
gumball_machine.set_state( gumball_machine.get_no_quarter_state() );
}
void turn_crank() {
std::cout << "You turned..." << std::endl;
gumball_machine.set_state( gumball_machine.get_sold_state() );
}
void dispense() {
std::cout << "No gumball dispensed" << std::endl;
}
};
class SoldState : public State {
public:
SoldState( GumballMachine &_gumball_machine ) : State(_gumball_machine) {}
void insert_quarter() {
std::cout << "Please wait, we're already giving you a gumball" << std::endl;
}
void eject_quarter() {
std::cout << "Sorry, you already turned the crank" << std::endl;
}
void turn_crank() {
std::cout << "Turning twice doesn't get you another gumball!" << std::endl;
}
void dispense() {
gumball_machine.release_ball();
if ( == gumball_machine.get_count() ) {
gumball_machine.set_state( gumball_machine.get_sold_out_state() );
}
else {
gumball_machine.set_state( gumball_machine.get_no_quarter_state() );
}
}
}; SoldOutState sold_out_state;
NoQuarterState no_quarter_state;
HasQuarterState has_quarter_state;
SoldState sold_state;
State *state;
unsigned count;
public:
GumballMachine( unsigned _count ) :
count(_count),
sold_out_state( *this ),
no_quarter_state( *this ),
has_quarter_state( *this ),
sold_state( *this ) {
if ( == count ) {
state = &sold_out_state;
}
else {
state = &no_quarter_state;
}
}
void release_ball() {
std::cout << "A gumball comes rolling out the slot" << std::endl;
count--;
if ( == count ) {
std::cout << "Oops, out of gumballs!" << std::endl;
}
}
unsigned get_count() { return count; }
void insert_quarter() { state->insert_quarter(); }
void eject_quarter() { state->eject_quarter(); }
void turn_crank() { state->turn_crank(); state->dispense(); }
void set_state( State *_state ) { state = _state; }
State *get_sold_out_state() { return &sold_out_state; }
State *get_no_quarter_state() { return &no_quarter_state; }
State *get_has_quarter_state() { return &has_quarter_state; }
State *get_sold_state() { return &sold_state; }
};
#endif

main.cpp

 #include "gumball_machine.h"

 int main() {
GumballMachine gumball_machine(); gumball_machine.insert_quarter();
gumball_machine.eject_quarter();
gumball_machine.insert_quarter();
gumball_machine.turn_crank(); gumball_machine.insert_quarter();
gumball_machine.eject_quarter();
gumball_machine.insert_quarter();
gumball_machine.turn_crank(); gumball_machine.insert_quarter();
gumball_machine.eject_quarter();
gumball_machine.insert_quarter();
gumball_machine.turn_crank();
return ;
}

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. 【新闻】超灵敏MRI技术:照亮人体肺部

    人口健康直接影响到一个国家的经济发展和社会进步.据我国2013年发布的肿瘤发病率统计年报表明,肺癌是我国目前首位恶性肿瘤,是癌症死亡的头号杀手,目前城市中每4名死亡的癌症患者中,约有1名是肺癌.如何开 ...

  2. mac下烦人的eclipse安装svn插件

    eclipse作为一个鸡肋般的java ide,颇有食之无味弃之可惜之感.最近公司统一对电脑做了一些处理,搞的我的eclipse都不能用了.重新安装了一下,各种maven.svn,代码格式什么的依赖神 ...

  3. jboss7的服务器开启和关闭命令

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. Foxmail

    我们在“POP3/SMTP服务”前面打钩,这样我们的QQ邮箱设置已经完成了,我们就可以在foxmail客户端上QQ邮箱了 QQ邮箱的POP3与SMTP服务器是什么? QQ邮箱 POP3 和 SMTP ...

  5. C#-获取datagriview选中行中某一列的值

    获取选中行中某一列的值: int index = dg_Product.CurrentRow.Index; //取得选中行的索引 txt_ProductId.Text = dg_Product.Row ...

  6. sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)

    一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万 ...

  7. android128 zhihuibeijing 科大讯飞 语音识别

    - 科大讯飞 开放平台 http://open.voicecloud.cn/ package com.itheima.voicedemo; import android.app.Activity; i ...

  8. 出栈入栈动画demo

    项目做了一个切换界面动画的功能,用到了出栈入栈的,写了一个demo package com.myron.stackview; import java.util.Stack; import androi ...

  9. 关于Git远程版本库

    Git作为分布式版本库控制系统,每个人都是本地版本库的主人,可以在本地的版本库中随心所欲的创建分支和里程碑. 当需要多人协作时,问题就出现了: 1.如何避免因为用户把所有的本地分支都推送到了共享版本库 ...

  10. C语言中 指针、引用和取值

    指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针 ...