版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态设计模式—状态模式场景1:设想一个银行卡帐户,每个帐户有多种可能的状态:正常、冻结、挂失、透支。帐号处于不同状态时对于以下操作会产生影响:存钱、取钱、刷卡消费、转账等。我们如何使用面向对象设计该场景?场景11、做什么(场景),需要解决的问题机器人传动装置场景4headFirst中的糖果机场景4:糖果机-我们可能的实现。糖果机有多种状态,如下图所示:分析阶段1、做什么(场景),需要解决的问题分析阶段1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机对象持有这些状态,并有当前状态,如下图所示:分析阶段1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机对象持有这些状态,并有当前状态,然后我们可以让糖果机开动起来,他的行为如下:1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机对象持有这些状态,并有当前状态,然后我们可以让糖果机开动起来,我们可以创建这个糖果机类,其代码实现如下:publicclassGumballMachine{ finalstaticintSOLD_OUT=0; finalstaticintNO_QUARTER=1; finalstaticintHAS_QUARTER=2; finalstaticintSOLD=3;
intstate=SOLD_OUT; intcount=0; publicGumballMachine(intcount){ this.count=count; if(count>0){state=NO_QUARTER; } }}1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机类的“投入25分钱”行为代码实现如下:publicvoidinsertQuarter(){if(state==HAS_QUARTER){ System.out.println("Youcan'tinsertanotherquarter");}elseif(state==NO_QUARTER){ state=HAS_QUARTER; System.out.println("Youinsertedaquarter");}elseif(state==SOLD_OUT){ System.out.println("Youcan'tinsertaquarter,themachineissoldout");}elseif(state==SOLD){ System.out.println("Pleasewait,we'realreadygivingyouagumball"); } }1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机类的“退回25分钱”行为代码实现如下:publicvoidejectQuarter(){if(state==HAS_QUARTER){ System.out.println("Quarterreturned"); state=NO_QUARTER;}elseif(state==NO_QUARTER){ System.out.println("Youhaven'tinsertedaquarter");}elseif(state==SOLD){ System.out.println("Sorry,youalreadyturnedthecrank");}elseif(state==SOLD_OUT){System.out.println("Youcan'teject,youhaven'tinsertedaquarteryet");}}1、做什么(场景),需要解决的问题场景4:糖果机-我们可能的实现。糖果机类的“转动曲柄”行为代码实现如下:publicvoidturnCrank(){if(state==SOLD){ System.out.println("Turningtwicedoesn'tgetyouanothergumball!");}elseif(state==NO_QUARTER){ System.out.println("Youturnedbutthere'snoquarter");}elseif(state==SOLD_OUT){ System.out.println("Youturned,buttherearenogumballs");}elseif(state==HAS_QUARTER){ System.out.println("Youturned..."); state=SOLD; dispense();}}场景4:糖果机-我们可能的实现。糖果机类的“售出糖果”行为代码实现如下:publicvoiddispense(){if(state==SOLD){ System.out.println("Agumballcomesrollingouttheslot"); count=count-1;
if(count==0){ System.out.println("Oops,outofgumballs!"); state=SOLD_OUT; }else{ state=NO_QUARTER;}}elseif(state==NO_QUARTER){ System.out.println("Youneedtopayfirst");}elseif(state==SOLD_OUT){ System.out.println("Nogumballdispensed");}elseif(state==HAS_QUARTER){ System.out.println("Nogumballdispensed"); }}场景4:糖果机-我们可能的实现。糖果机类的“装糖果”行为代码实现如下:publicvoidrefill(intnumGumBalls){ this.count=numGumBalls; state=NO_QUARTER; }场景4:糖果机-我们可能的实现。糖果机类的客户端代码实现如下:publicstaticvoidmain(String[]args){ GumballMachinegumballMachine=newGumballMachine(5); System.out.println(gumballMachine); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine); gumballMachine.insertQuarter(); gumballMachine.ejectQuarter(); gumballMachine.turnCrank(); System.out.println(gumballMachine);}场景4:糖果机-我们可能的实现。该来的躲不掉--需求变更--问题来了,如下图:修改代码?还是扩展代码?修改代码:混乱的状态修改代码让我头晕啦?要看这么多代码,才能知道我应该修改哪里!修改了这里还不知道其他地方有没有问题!不知道什么时候测试才能彻底证明我的糖果机不会出问题!要是糖果机能够自己按照“自己的状态”出牌就好了-不管我怎么破坏它!场景4:改进糖果机的实现。如果将糖果机的行为委托给他的当前的状态对象呢?--一谈到对象,我们挺清楚的?是吗?我们不谈逻辑,让对象自己负责逻辑吧!怎么办:请将上面的意图用主谓句来说明:糖果机投入25分钱,糖果机委托当前状态对象,当前状态对象处理“投入25分钱”(的逻辑)。2.谁来做:糖果机投入25分钱,糖果机委托当前状态对象,当前状态对象处理“投入25分钱”(的逻辑)。有哪些角色?3.谁做什么:糖果机投入25分钱(其他动作省略),糖果机委托当前状态对象,当前状态对象处理“投入25分钱”(的逻辑)。这些角色是怎样协作完成行为的--糖果机投入25分钱,需要和谁协作呢?4.可以在这些步骤的任何地方看看有没有需要抽象的角色,有利于我们设计规范和扩展场景4:糖果机状态模式的实现。那么SoldOut状态类的实现呢?还有那个十次抽中一次的游戏如何完成呢?1)如何才能进入winnerState?2)winnerState如何实现?请动手!场景4:糖果机状态模式的实现。那么SoldOut状态类的实现呢?还有那个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 序言 物理学物质及其运动规律的科学机械运动 教学设计 -2024-2025学年高一上学期物理学人教版(2019)必修第一册
- 人美版七上美术 14如何欣赏绘画作品(选修) 教案
- 灯塔市2024-2025学年数学三上期末考试试题含解析
- 陕西省延安市富县2024年数学三年级第一学期期末教学质量检测模拟试题含解析
- 咖啡馆食品安全与卫生管理考核试卷
- 人教版七年级上册 第一节 藻类、苔藓和蕨类植物 教学设计
- 塑料人造革的色彩稳定性与耐光性测试考核试卷
- 亚热带水果种植技术创新案例考核试卷
- 颅内感染护理讲课
- 教育文具在特殊教育领域的应用考核试卷
- NB/T 10742-2021智能化综采工作面设计规范
- GB/T 18883-2002室内空气质量标准
- 老年妆表现技法课件
- 《把时间当朋友》课件
- 硬化性肺泡细胞瘤-课件
- WPS-Office办公软件应用技巧培训课件
- 《甲午战争》全国一等奖教学设计
- 三年级上册英语课件-Unit6 Happy birthday -人教(PEP) (9)(共17张PPT)
- 过氧化氢低温等离子体灭菌器规范操作课件
- 施工组织设计-临时用地表
- DB45-T 1696-2018危岩防治工程技术规范-(高清可复制)
评论
0/150
提交评论