面向对象范式-2014状态模式_第1页
面向对象范式-2014状态模式_第2页
面向对象范式-2014状态模式_第3页
面向对象范式-2014状态模式_第4页
面向对象范式-2014状态模式_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态设计模式—状态模式场景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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论