:状态模式:GumballMachine
- #ifndef __STATE_H__
- #define __STATE_H__
- #include <iostream>
- #include<stdlib.h>
- using namespace std;
- class GumballMachine;
- class State
- {
- public:
- State();
- virtual ~State();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- class NoQuarterState : public State
- {
- private:
- GumballMachine *gumballmachine;
- public:
- NoQuarterState(GumballMachine *g);
- virtual ~NoQuarterState();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- class SoldOutState :public State
- {
- private:
- GumballMachine *gumballmachine;
- public:
- SoldOutState(GumballMachine *g);
- virtual ~SoldOutState();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- class HasQuarterState :public State
- {
- private:
- GumballMachine *gumballmachine;
- public:
- HasQuarterState(GumballMachine *g);
- virtual ~HasQuarterState();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- class SoldState :public State
- {
- private:
- GumballMachine *gumballmachine;
- public:
- SoldState(GumballMachine *g);
- virtual ~SoldState();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- class WinnerState :public State
- {
- private:
- GumballMachine *gumballmachine;
- public:
- WinnerState(GumballMachine *g);
- virtual ~WinnerState();
- virtual void insertQuarter();
- virtual void ejectQuarter();
- virtual void turnCrank();
- virtual void dispense();
- };
- #endif
- #include "State.h"
- #include "GumballMachine.h"
- void State::dispense()
- {
- }
- void State::turnCrank()
- {
- }
- void State::ejectQuarter()
- {
- }
- void State::insertQuarter()
- {
- }
- State::~State()
- {
- }
- State::State()
- {
- }
- NoQuarterState::~NoQuarterState()
- {
- }
- NoQuarterState::NoQuarterState(GumballMachine *g)
- {
- gumballmachine = g;
- }
- void NoQuarterState::dispense()
- {
- cout << "You need to pay first." << endl;
- }
- void NoQuarterState::turnCrank()
- {
- cout << "You turned, but there is no quarter." << endl;
- }
- void NoQuarterState::ejectQuarter()
- {
- cout << "You has not insert quarter." << endl;
- }
- void NoQuarterState::insertQuarter()
- {
- cout << "You insert a quarter." << endl;
- gumballmachine->SetState(gumballmachine->GetHasQuarterState());
- }
- void SoldOutState::dispense()
- {
- cout << "Sold out." << endl;
- }
- void SoldOutState::turnCrank()
- {
- cout << "Sold out, there is no quarter." << endl;
- }
- void SoldOutState::ejectQuarter()
- {
- cout << "Sold out, can't eject quarter." << endl;
- }
- void SoldOutState::insertQuarter()
- {
- cout << "Sold out, You can't insert a quarter." << endl;
- }
- SoldOutState::~SoldOutState()
- {
- }
- SoldOutState::SoldOutState(GumballMachine *g)
- {
- gumballmachine = g;
- }
- void HasQuarterState::dispense()
- {
- cout << "No gum ball dispensed." << endl;
- }
- void HasQuarterState::turnCrank()
- {
- cout << "You turned." << endl;
- int winner = (rand() % 10);
- if (winner == 0 && gumballmachine->getCount() > 1)
- {
- gumballmachine->SetState(gumballmachine->GetWinnerState());
- }
- else
- {
- gumballmachine->SetState(gumballmachine->GetSoldState());
- }
- }
- void HasQuarterState::ejectQuarter()
- {
- cout << "Quarter returned." << endl;
- gumballmachine->SetState(gumballmachine->GetNoQuarterState());
- }
- void HasQuarterState::insertQuarter()
- {
- cout << "You can't insert another quarter." << endl;
- }
- HasQuarterState::~HasQuarterState()
- {
- }
- HasQuarterState::HasQuarterState(GumballMachine *g)
- {
- gumballmachine = g;
- }
- void SoldState::dispense()
- {
- gumballmachine->releaseBall();
- if (gumballmachine->getCount() > 0)
- {
- gumballmachine->SetState(gumballmachine->GetNoQuarterState());
- }
- else
- {
- cout << "Oops, out of gum balls!" << endl;
- gumballmachine->SetState(gumballmachine->GetSoldOutState());
- }
- }
- void SoldState::turnCrank()
- {
- cout << "Turning twice does not get you another gum ball." << endl;
- }
- void SoldState::ejectQuarter()
- {
- cout << "Sorry, you already turned the crank." << endl;
- }
- void SoldState::insertQuarter()
- {
- cout << "Please wait, we are already giving you a gum ball." << endl;
- }
- SoldState::~SoldState()
- {
- }
- SoldState::SoldState(GumballMachine *g)
- {
- gumballmachine = g;
- }
- void WinnerState::dispense()
- {
- cout << "YOU ARE A WINNER, You get two gum balls." << endl;
- gumballmachine->releaseBall();
- if (gumballmachine->getCount() == 0)
- {
- gumballmachine->SetState(gumballmachine->GetSoldOutState());
- }
- else
- {
- gumballmachine->releaseBall();
- if (gumballmachine->getCount() == 0)
- {
- gumballmachine->SetState(gumballmachine->GetSoldOutState());
- }
- else
- {
- gumballmachine->SetState(gumballmachine->GetNoQuarterState());
- }
- }
- }
- void WinnerState::turnCrank()
- {
- cout << "Turning twice does not get you another gum ball." << endl;
- }
- void WinnerState::ejectQuarter()
- {
- cout << "Sorry, you already turned the crank." << endl;
- }
- void WinnerState::insertQuarter()
- {
- cout << "Please wait, we are already giving you a gum ball." << endl;
- }
- WinnerState::~WinnerState()
- {
- }
- WinnerState::WinnerState(GumballMachine *g)
- {
- gumballmachine = g;
- }
- #ifndef __GUMBALLMACHINE_H__
- #define __GUMBALLMACHINE_H__
- #include "State.h"
- #include <iostream>
- #include<stdlib.h>
- using namespace std;
- //class State;
- class GumballMachine
- {
- private:
- State *soldOutState;
- State *noQuarterState;
- State *hasQuarterState;
- State *soldState;
- State *winnerState;
- State *CurrentState;
- int Count;
- public:
- GumballMachine(int num);
- ~GumballMachine();
- void insertQuarter();
- void ejectQuarter();
- void turnCrank();
- void SetState(State *st);
- State * GetNoQuarterState();
- State * GetWinnerState();
- State * GetHasQuarterState();
- State * GetSoldState();
- State * GetSoldOutState();
- void releaseBall();
- int getCount();
- };
- #endif
- #include "GumballMachine.h"
- int GumballMachine::getCount()
- {
- return Count;
- }
- void GumballMachine::releaseBall()
- {
- cout << "A ball comes rolling out the slot." << endl;
- if (Count != 0)
- {
- Count--;
- }
- }
- State * GumballMachine::GetSoldOutState()
- {
- return soldOutState;
- }
- State * GumballMachine::GetSoldState()
- {
- return soldState;
- }
- State * GumballMachine::GetHasQuarterState()
- {
- return hasQuarterState;
- }
- State * GumballMachine::GetWinnerState()
- {
- return winnerState;
- }
- State * GumballMachine::GetNoQuarterState()
- {
- return noQuarterState;
- }
- void GumballMachine::SetState(State *st)
- {
- CurrentState = st;
- }
- void GumballMachine::turnCrank()
- {
- CurrentState->turnCrank();
- CurrentState->dispense();
- }
- void GumballMachine::ejectQuarter()
- {
- CurrentState->ejectQuarter();
- }
- void GumballMachine::insertQuarter()
- {
- CurrentState->insertQuarter();
- }
- GumballMachine::~GumballMachine()
- {
- }
- GumballMachine::GumballMachine(int num)
- {
- Count = num;
- soldOutState = new SoldOutState(this);
- noQuarterState = new NoQuarterState(this);
- hasQuarterState = new HasQuarterState(this);
- winnerState = new WinnerState(this);
- soldState = new SoldState(this);
- if (Count > 0)
- {
- CurrentState = noQuarterState;
- }
- }
- #include <iostream>
- #include "GumballMachine.h"
- using namespace std;
- int main()
- {
- GumballMachine *g = new GumballMachine(10);
- for (int i = 0; i < 11; i ++)
- {
- cout << "================================" << endl;
- g->insertQuarter();
- g->turnCrank();
- }
- return 0;
- }
:状态模式:GumballMachine的更多相关文章
- Head First 设计模式 --10 状态模式
状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类. 用到的设计原则1.封装变化2.多用组合,少用继承3.针对接口编程,不针对实现编程4.松耦合5.对扩展开放,对修改关闭6.依 ...
- 《Head First 设计模式》学习笔记——状态模式
在软件开发过程中.应用程序可能会依据不同的情况作出不同的处理. 最直接的解决方式是将这些全部可能发生的情况全都考虑到.然后使用if... ellse语句来做状态推断来进行不同情况的处理. 可是对复杂状 ...
- C#设计模式之10:状态模式
状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...
- Head First设计模式——状态模式
糖果机 如下糖果机工作状态图,我们对这个状态图进行编码实现糖果机的工作过程 这个状态图的每个圆圈代表一个状态,可以看到有4个状态同时又4个动作,分别是:“投入1元钱”.“退回1元钱”.“转动曲柄”.“ ...
- 《Head First 设计模式》:状态模式
正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...
- StatePattern(状态模式)
/** * 状态模式 * @author TMAC-J * 状态模式和策略模式很像,其实仔细研究发现完全不一样 * 策略模式各策略之间没有任何关系,独立的 * 状态模式各状态之间接口方法都是一样的 * ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- php实现设计模式之 状态模式
<?php /*状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(行为模式) * * 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做 ...
- Java 策略模式和状态模式
本文是转载的,转载地址:大白话解释Strategy模式和State模式的区别 先上图: 本质上讲,策略模式和状态模式做得是同一件事:去耦合.怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开, ...
- javascript - 状态模式 - 简化分支判断流程
状态模式笔记 当一个对象的内部状态发生改变时,会导致行为的改变,这像是改变了对象 状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次 ...
随机推荐
- Program Option Modifiers
Some option are 'boolean' and control behavior that can be turned on or off. --column-names option d ...
- week02 课堂作业
测试一:(点此看原题目) 运行结果: 测试二:(点此看原题目) 运行结果: 测试三:(点此看原题目) 运行结果:
- 安卓中使用HttpURLConnection连接网络简单示例 --Android网络编程
MainActivity.java: package thonlon.example.cn.httpurlconnectionpro; import android.os.Bundle;import ...
- ssd制作数据和训练
1.在/data/VOCdevkit下建立自己的数据集名称如MyDataSet,在MyDataSet目录下需包含Annotations.ImageSets.JPEGImages三个文件夹: 2.Ima ...
- pre打印
echo "<pre>";print_r(var);echo "</pre>";
- 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 ...
- Appium移动自动化测试(一)----Appium的安装
前言: 我的环境为win10 64,安装过程请根据自己的电脑环境而定. 一.Appium安装 1.Appium官方网站:http://appium.io/下载windows版本的Appium; Eas ...
- JavaScript工具函数集
/** * [getQueryStringArgs 用以解析查询字符串] * @return {[Object]} [一个包含所有参数的对象] */ function getQueryStringAr ...
- 51Nod 1001 数组中和等于K的数对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1001一开始的想法是排序后二分搜索,发现会进行非常多不必要的遍历,十分耗时 ...
- Git:创建远程仓库并推送内容到远程库
1.添加远程仓库 1.1点击该按钮创建一个新仓库 2.推送到远程仓库 2.1根据GitHub的提示,在本地的learngit仓库下运行命令git remote add origin https://g ...