网站大量收购独家精品文档,联系QQ:2885784924

第十章 状态模式精要.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 状态模式精要

状态模式 Java烤面包机已经落伍了,现在人们已经把java创建在像糖果机这样的装置中了。现在万能糖果公司希望我们用java语言帮他们实现如下工能。 现在让我们来实现它吧! 1、首先,找出所有状态: 2、接下来,创建一个实例变量来持有目前的状态,然后定义每个状态的值: 将“糖果售罄”简称为“售罄” (sold out)。 Final static int SOLD_OUT=0; Final static int NO_QUARTER=1; Final static int HAS_QUARTER=2; Final static int SOLD=3; Int state =SOLD_OUT; 每一个状态都用一个不同的整数代表。 这是一个实例变量,持有当前状态。我们将它设置为“糖果售罄”状态,因为糖果机一开始拆箱并安装是没有有糖果的。 3、现在,我们将所有系统中可以发生的动作整合起来: 投入25分钱 退回25分钱 转动曲柄 发放糖果 这些动作都是糖果机的接口,——这是你能对糖果机做的事情。 看看这个图,调用任何一个动作都会造成状态的转换。 发放糖果更多的是糖果机内部动作,机器自己调用自己。 4、现在我们来创建一个类,它的作用就相当于一个状态机。对每个动作,我们都创建一个对应的方法,对这些方法用条件语句来决定每个状态内的行为是恰当的。 Public void insertQuarter(){ if(state==HAS_QUARTER){ system.out.println(“you can’t insert another quarter”); }else if(state==SOLD_OUT){ system.out.println(“you can’t insert a quarter,the machine is sold out”); }else is(state==SOLD){ system.out.println(“please wait,we’re already gving you a gumball”); }else if(“state==NO_QUARTER”){ state=HAS_QUARTER; system.out.println(“you inserted a quarter”); 每一个可能的状态都需要用条件语句检查… 然后对每一个可能的状态展现适当的行为 现在让我们来实现它吧! 现在我们可以开始出售糖果了,但是万能糖果公司想要变点花样。 当个赢家,每10个 人有一个可以 得到免费糖果。 当曲柄被转动时,有10%的几率掉下来的是两颗糖果。 新的设计: 那么应该如何实现它呢?让我们先来修改以前的代码: Final static int SOLD_OUT=0; Final static int NO_QUARTER=1; Final static int HAS_QUARTER=2; Final static int SOLD=3; Public void insertQuarter(){ //投币代码; } Public void ejectQuarter(){ //退币代码; } Public void turnCrank(){ //转动曲柄代码; } Public void dispense(){ //放糖果代码; } 首先,你必须加上一个新的“赢家”状态。 然后,你必须在每个方法中加入一个新的条件来判断处理“赢家”状态; turnCrank()尤其会变得一团乱,因为你必须加上代码来检查目前顾客是否是赢家,然后在来决定是切换到赢家状态还是出售糖果状态。 这样子不妙。第一个版本虽 然不错,但随着万能糖果公司 新的需求出现,这个版本已经 不适用了。程序中bug的几率 增大,会给我们带来麻烦。 那我们应该如何做改变呢? 新的设计 我们计划是这样的:不要维护我们现有的代码,我们重写它将状态对象封装在各自的类中,然后动作发生时委托给当前状态。 1、首先,我们定义一个State接口。在这个接口内,糖果机的每个动作都有一个对应的方法。 2、然后为机器中的每个状态实现状态类。这些类将负责在对应的状态下进行机器的行为。 3、最后,我们要摆脱旧的条件代码,取而代之的方法是,将动作委托到状态类。 定义状态接口和类: 这就是所有状态的接口。这些方法直接映射到糖果机上可能发生的动作。 然后我们将每个状态直接映射到一个类。 实现我们的状态类: Public class NoQuarterState implements State{ GumballMachine gumballMachine; Public NoQua

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档