headFirst学习笔记之十:状态模式(5.2)

作者:网络    软件教程库   2020-05-16

1.如何从状态图得到真正的代码:

(1)找出所有状态:没有25分钱,有25分钱,糖果售罄,售出糖果。

(2)创建一个实例变量来持有目前状态,并且定义每个状态的值:

1 final static int sold_out = 0;
2 final static int no_quarter = 1;
3 final static int has_quarter = 2;
4 final static int sold = 3;
5 
6 int state = sold_out;

(3)找出所有的动作:投入25分钱,退回25分钱,转动曲柄,发放糖果。每一个动作都对应一个方法,而方法内通过条件判断是否可以执行这个动作。

(4)创建一个类,模拟状态机。

 1 public class gumballmachine {
 2     final static int sold_out = 0;//售罄
 3     final static int no_quarter = 1;//无25分
 4     final static int has_quarter = 2;//有25分
 5     final static int sold = 3;//售出糖果
 6      
 7     int state = sold_out;
 8     int count = 0;//糖果机内糖果数量
 9     
10     public gumballmachine(int count) {
11         super();
12         this.count = count;
13         //如果库存不为0,就会进入没有25分,来等待别人投钱。否则就进入售罄,无法投钱
14         if(count0){
15             state = no_quarter;
16         }
17     }
18     //投钱
19     public void insertquater(){
20         if(state == has_quarter){
21             system.out.println("已经投过25分");
22         }
23         else if(state == no_quarter){
24             system.out.println("你投入了25分");
25             state = has_quarter;
26         }
27         else if(state == sold_out){
28             system.out.println("已经售罄,无法投钱");
29         }
30         else if(state == sold){
31             system.out.println("正在出糖果,请等待一会再投钱");
32         }
33     }
34     //退钱
35     public void ejectquater(){
36         if(state == has_quarter){
37             system.out.println("退回25分");
38             state = no_quarter;
39         }
40         else if(state == no_quarter){
41             system.out.println("您并未投钱");
42         }
43         else if(state == sold_out){
44             system.out.println("您并未投钱");
45         }
46         else if(state == sold){
47             system.out.println("已经在出糖果,无法退钱");
48         }
49     }
50     //转动手柄
51     public void turncrank(){
52         if(state == has_quarter){
53             system.out.println("您转动了手柄");
54             state = sold;
55             dispense();
56         }
57         else if(state == no_quarter){
58             system.out.println("请先投钱再转动手柄");
59         }
60         else if(state == sold_out){
61             system.out.println("您并未投钱");
62         }
63         else if(state == sold){
64             system.out.println("已经给您糖果了,哼,别想骗我");
65         }
66     }
67     //发放糖果
68     private void dispense() {
69         if(state == has_quarter){
70             system.out.println("no gumball dispense");
71         }
72         else if(state == no_quarter){
73             system.out.println("请先投钱");
74         }
75         else if(state == sold_out){
76             system.out.println("no gumball dispense");
77         }
78         else if(state == sold){
79             count = count - 1;
80             if(count ==0){
81                 system.out.println("最后 一颗糖果!");
82                 state = sold_out;
83             }else{
84                 system.out.println("给您糖果!");
85                 state = no_quarter;
86             }
87         }
88     }     
89 }

2.万能糖果机要添加一种游戏:当个赢家!十个人中有1个人可以得到赠送的一颗糖果(也就是说,当曲柄转动时,有10%的机率掉下来的是两颗糖果)。

问题来了:照刚刚的写法,我们首先要添加一个赢家状态,然后再每一个方法中,加入一个新的条件判断来处理赢家状态,尤其是turncrank,因为你必须坚持目前是否"赢家",然后再决定是切换到赢家状态还是售出糖果状态。

解决办法:局部化每个状态的行为,将每个状态的行为都放在各自的类中,那么每个状态都只需要实现自己的动作。

(1)定义一个state接口,在这个接口里,糖果机的每个动作都有一个对应的方法。

(2)为每个状态实现状态类,这些类负责对应状态下机器的行为。

(3)摆脱条件判断代码,将动作委托到状态类。

1 public interface state {
2     public void insertquater();
3     public void ejectquater();
4     public void turncrank();
5     public void dispense();
6 }

 1 public class gumballmachine {
 2     state soldoutstate;
 3     state soldstate;
 4     state hasquarterstate;
 5     state noquarterstate;
 6      
 7     state state = soldoutstate;
 8     int count = 0;
 9     
10     public gumballmachine(int count) {
11         super();
12         soldoutstate = new soldoutstate(this);
13         soldstate = new soldstate(this);
14         hasquarterstate = new hasquarterstate(this);
15         noquarterstate = new noquarterstate(this);
16         this.count = count;
17         //如果库存不为0,就会进入没有25分,来等待别人投钱。否则就进入售罄,无法投钱
18         if(count0){
19             state = noquarterstate;
20         }
21     }
22     //投钱
23     public void insertquater(){
24         state.insertquater();
25     }
26     //退钱
27     public void ejectquater(){
28         state.ejectquater();
29     }
30     //转动手柄
31     public void turncrank(){
32         state.turncrank();
33         state.dispense();
34     }
35     public void setstate(state state) {
36         this.state = state;
37     }
38     
39     void releasball(){
40         system.out.println("糖果正在滚出来的路上");
41         if(count!=0){
42             count = count-1;
43         }
44     }
45     public state getsoldoutstate() {
46         return soldoutstate;
47     }
48     public state getsoldstate() {
49         return soldstate;
50     }
51     public state gethasquarterstate() {
52         return hasquarterstate;
53     }
54     public state getnoquarterstate() {
55         return noquarterstate;
56     }
57 }

 1 public class soldstate implements state {
 2 
 3     gumballmachine gumballmachine;
 4     
 5     public soldstate(gumballmachine gumballmachine) {
 6         super();
 7         this.gumballmachine = gumballmachine;
 8     }
 9 
10     public void dispense() {
11         gumballmachine.releasball();
12         if(gumballmachine.getcount()0){
13             gumballmachine.setstate(gumballmachine.getnoquarterstate());
14         }else{
15             system.out.println("卖完了");
16             gumballmachine.setstate(gumballmachine.getsoldoutstate());
17         }
18     }
19 
20     public void ejectquater() {
21         system.out.println("准备发糖,无法退钱");
22     }
23 
24     public void insertquater() {
25         system.out.println("请等糖出完");
26     }
27 
28     public void turncrank() {
29         system.out.println("已经在出糖,不用转动手柄了");
30     }
31 
32 }

3.别忘了,我们游戏还没完成呢:

待续。

headfirst学习笔记之十:状态模式(5.2)

原文地址:http://www.cnblogs.com/liyuhui21310122/p/4471490.html

这篇内容就是由软件教程库 小编为各位整理 原文链接:https://www.itjcku.com/9999/1091434.html

阅读全部内容


Tags:学习笔记10状态状况模式

返回首页



推荐内容

zabbixPHPdatabasessupportoffFail

zabbix初始化检查安装环境不通过: php databases support off fail --未找到所 ...

JS中字符串,数组常见操作

字符串mdash;mdash;mdash;》数组 abc =gt; ["a","b","c"]直接使用split方法 ...

IOS简单的动画自定义方法(旋转、移动、闪烁等)

#define kdegreestoradian(x) (m_pi * (x) /180.0) #define kra ...

swift学习笔记3-4

再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己。 三、运算符+表达式 swift允 ...

Trie树初学

#includelt;cstdiogt; #includelt;cstringgt; #includelt;cstdli ...

Android--状态栏高度

干货 classlt;gt; c = null; object obj = null; field field = n ...

//hdu2222//AC自动机初学

// hdu2222 // #includelt;cstdiogt; #includelt;cstringgt; #in ...

黑书笔记

就从p77开始记好了.(稍微扩容) p77 排序. 1.香农信息论 基于比较的排序不可能突破o(nlogn)的复杂度限制 ...

//codeforces471D//kmp初学

// codeforces 471d // #includelt;cstdiogt; #includelt;cstrin ...

搭建基于域名虚拟主机

修改主配置文件 # cd /etc/httpd/conf.d/ # vim vhost.conf lt;virtu ...

Mysql5.6.24zip解压缩版配置及修改默认编码方法

win64位下载地址: http://dev.mysql.com/downloads/file.phpid=456319 ...

图片的预加载和按需加载

图片预加载 lt;!doctype htmlgt; lt;htmlgt; lt;headgt; lt;meta htt ...

iPhone/iPad程序怎么禁止自动休眠

//禁止自动休眠可以通过这一句话搞定:[uiapplication sharedapplication].idletim ...

普林斯顿《算法II》第一周学习笔记UndirectedGraph

普林斯顿的算法课是cousera上评价挺高的一门课,课程的教学语言用的是java,课程中的算法都会被封装成类的形式,对于 ...

headFirst学习笔记之九:迭代器与组合模式(5.1)

1.任务: 大新闻!对象村餐厅和对象村煎饼屋合并了!可以在同一个地方吃早饭和午饭了hohoho(有什么好开森的对象村的小 ...

IOSapplicationWillResignActive

一、挂起当有电话进来或者锁屏,这时你的应用程会挂起,在这时,uiapplicationdelegate委托会收到通知,调 ...

哥我要向前看了

七年前的五一节前的那个周六,我遇到生命中一个重要的人。虽然相处短暂,好梦不长,但是回忆丰满,念念不忘。 七年后的五一节, ...

GoldSmith第二章

uhf:特高频 300m-3000mhz shf:超高频 3g-30g 所有发射与接收的信号都是实信号(因为调制器的振荡 ...

动态规划总结【模板】

最长递增子序列 给定一个序列,找到最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。 1.求最长递增子序列的 ...

HDUACM1103Flo'sRestaurant

分析:借助stl的min_element实现。每次更新最先被占用的桌子,具体见注释。 #includelt;iostre ...

【翻译自mos文章】Oracledb12c中,每次日志切换时,会改变alert_sid.log的权限

12c中,每次日志切换时,会改变alert_sid.log的权限 来源于: alert log file‘s perm ...

poj1988(并查集)

题意:有30000个木块,编号从1到30000,然后有两种操作m a b,把木块a所在的堆块放到木块b所在的堆块上,操作 ...

org.hibernate.exception.GenericJDBCException:Couldnotopenconnection

1、错误描述 org.hibernate.exception.genericjdbcexception: could ...

ubuntu下mysql导出数据

使用的是workbench,原因时workbench的导出工具mysqldump和mysql的版本不一致,这个时候手动指 ...

怎样看懂女人哪些最直接的肢体暗示,撒娇

主动拥抱。 拥抱是最简单却十分亲密的身体接触,女人在想亲热时,会主动寻求拥抱,向伴侣靠近。如果她躺在你的怀抱中,并用语言 ...

移动后端云平台Bmob介绍

对于移动端的独立开发者来说,最痛苦的事情莫过于搭建后台服务器。没有基础的还得从头学起,有技术的又要搭建维护后台,非常 ...

WAMP配置虚拟主机

问题背景:从网上下载了一个php项目a,a项目需要部署在网站的根目录下。配置虚拟主机可以解决这个问题。1.打开apach ...

java克隆测试

1.person类 1 //clone方法必须实现cloneable接口 2 public class perso ...

C++string中用于查找的find系列函数浅析

总述:以下所讲的所有的string查找函数,都有唯一的返回类型,那就是size_type,即一个无符号整数(按打印出来的 ...

Savingoutputofagrepintoafilewithcolors

19 down vote favorite 7 i need to save the result o ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com