版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件构造第5次实验实验报告班级:学号:姓名:2016年4月20日
一.设计1.本次实验旨在通过对电梯调度控制器系统的模拟来进一步理解和掌握状态模式。首先,我们类比了糖果机的状态图,经过多次的修改,完成了以上的状态图。如图所示,一部电梯的初始状态是IdleState空闲状态,当有人按下上/下楼按钮时,若电梯位于当前楼层,则直接开/关门(OpenOrCloseState);若电梯位于其他楼层,则需要先运行(RunState)至乘客所在的楼层,当运行至乘客所在楼层,转换至开/关门(OpenOrCloseState),然后电梯进入空闲状态(IdleState),当乘客进入电梯后按下电梯内的楼层数字按钮时,电梯进入运行状态(RunState),将乘客送至所需的楼层。
StateidleStateStateopenOrDownStateStaterunStateStatestateintourrentFloorintdestinationFloorScheduler+numberButtonWasPushed()4-upOrDownButtonWasPushed()A+setState()+setCurrentFloor))+setDestinationFloor()+open()+chse()+getldleStated+getOpenOrCtoseState()Scheduler+numberButtonWasPushed()4-upOrDownButtonWasPushed()A+setState()+setCurrentFloor))+setDestinationFloor()+open()+chse()+getldleStated+getOpenOrCtoseState()+getRunStatef)+getCurrentFIdof()+getDestinationFlDQr()+getState(J+taString()+numberButtonWasPushed()+upOrDownButtonWasPushed()-FarriveStartingl)4-arriveDestination()Schedulerscheduler4-pushUpOrDownButton()+pushNumberButton()Elevatorelevator+numberButtonWasPushed()+upOrDownButtonWasPushed()4-arriveStarting()+arriveDestination()Elevatorelevator+numberButtonWasPushed()+upOrDownButtonWasPushed()4-arriveStanting()+arriveDestination()Elevatorelevator+numberButtonWasPushed()+upOrDownButtonWasPushed()4-arriveStarting()4arriveDestination().基于状态模式的电梯调度控制器系统如上图所示。状态模式,即允许对象在内部状态改变时改变它的行为,对象看起来好像是修改了它的类。在状态模式中,客户不会直接和状态交互,只有Context才会对状态提出请求。.从UML类图中可以看到,我们为电梯类(Elevator)提供了获得各个状态的对象方法,即getIdleState()等,这些方法是用于各个具体状态类来实现状态转换的,如下图所示:publicvoidjpDrDownEuttonWasPushed(intfloor)-[System.out.printIn(riYojpasbedtheUpOrDownButton.ri);if(floor=="已寸己匚口工.自已9口工工.”1口口士【))■[一若电梯位于熊客来自的楼层直接开门elevator.setState(elevator.getOpenOrClosestate());收工氏{//若电梯当前位于其他楼层,应先运行至乘客所在的楼层elevator.setState(elevator.getRunState());elevator.setDestinationFloor(floor);setState()方法的参数应该是对象而非类,因为可以有多部电梯,而不同电梯同一时刻的状态可能是不同的,为了保证电梯之间的状态不会产生混乱,我们需要在Elevator类中提供能够返回每种状态的对象的方法。二.实现I.State/**状态接口@authorYilia*/publicinterfaceState{voidnumberButtonWasPushed(intfloor);//按下楼层数字按钮(电梯内部)参数为需要到达的楼层voidupOrDownButtonWasPushed(intfloor);//按下上/下按钮(电梯外部)参数表示乘客来自哪一个楼层voidarriveStarting();//到达任务开始的楼层voidarriveDestination();//至九达目的的楼层)2.IdleState/**空闲状态@authorYilia**/publicclassIdleStateimplementsState{Elevatorelevator;//intcurrentFloor;publicIdleState(Elevatorelevator){this.elevator=elevator;)publicvoidnumberButtonWasPushed(intfloor){System.out.println("YoupushedtheNumberButton.");elevator.setState(elevator.getRunState());elevator.setDestinationFloor(floor);)publicvoidupOrDownButtonWasPushed(intfloor){System.out.println("YoupushedtheUpOrDownButton.");if(floor==elevator.getCurrentF100r()){//若电梯位于乘客来自的楼层直接开门elevator.setState(elevator.getOpenOrCloseState());}else{//若电梯当前位于其他楼层,应先运行至乘客所在的楼层elevator.setState(elevator.getRunState());elevator.setDestinationFloor(floor);}}publicvoidarriveStarting(){System.out.println("YouhavetopushtheUpOrDownButton.");}publicvoidarriveDestination(){System.out.println("Thereisnooneintheelevator.");}}3.OpenOrCloseState/***开/关门*@authorYilia**/publicclassOpenOrCloseStateimplementsState{Elevatorelevator;//intfloor;publicOpenOrCloseState(Elevatorelevator){this.elevator=elevator;}publicvoidnumberButtonWasPushed(intfloor){elevator.setState(elevator.getIdleState());}publicvoidupOrDownButtonWasPushed(intfloor){elevator.setState(elevator.getIdleState());}publicvoidarriveStarting(){elevator.setState(elevator.getIdleState());)publicvoidarriveDestination(){elevator.setState(elevator.getIdleState());))4.RunTimeState/***运行状态*@authorYilia**/publicclassRunStateimplementsState{Elevatorelevator;intDestinationFloor;publicRunState(Elevatorelevator){this.elevator=elevator;)publicvoidnumberButtonWasPushed(intfloor){System.out.println("Theelevatorisrunningnow!");)publicvoidupOrDownButtonWasPushed(intfloor){System.out.println("Pleasewaitamunite.");)publicvoidarriveStarting(){elevator.setCurrentF100r(elevator.getDestinationF100r());System.out.println("Theelevatorarriveatthe"+elevator.getCurrentF100r()+"floor.");elevator.setState(elevator.getOpenOrCloseState());elevator.open();//人上电梯elevator.close();)publicvoidarriveDestination(){elevator.setCurrentF100r(elevator.getDestinationF100r());System.out.print1n("Theelevatorarriveatthe"+elevator.getCurrentF100r()+"floor.");elevator.setState(elevator.getOpenOrCloseState());elevator.open();//人下电梯elevator.close();)5.Elevator/**对应GumballMachine@authorYilia**/publicclassElevator//三个状态StateidleState;StateopenOrCloseState;StaterunState;Statestate=idleState;//State实例变量intcurrentFloor=1;//将当前楼层初始化为1楼intdestinationFloor=-1;//将目的楼层初始化为负数//构造器:为每一个状态创建状态实例,默认电梯从1楼publicElevator(){//this.level=level;idleState=newIdleState(this);openOrCloseState=newOpenOrCloseState(this);runState=newRunState(this);state=idleState;)//构造器:取得当前所在的楼层,为每一个状态创建状态实例publicElevator(intfloor){this.currentFloor=floor;idleState=newIdleState(this);openOrCloseState=newOpenOrCloseState(this);runState=newRunState(this);state=idleState;)//将动作委托到当前状态//注意:ArriveStarting()和ArriveDestanation()动作方法是内部的动作,用户不可以直接让电梯到达楼层publicvoidnumberButtonWasPushed(intfloor){state.numberButtonWasPushed(floor);state.arriveDestination();)publicvoidupOrDownButtonWasPushed(intfloor){state.upOrDownButtonWasPushed(floor);state.arriveStarting();)//允许状态对象改变机器的状态voidsetState(Statestate){this.state=state;)voidsetDestinationFloor(intfloor){this.destinationFloor=floor;)voidsetCurrentF100r(intfloor){this.currentFloor=floor;)//开关门voidopen(){System.out.println("Thedoorisopen.");)voidclose(){System.out.println("Thedoorisclose.");)// //到达指定楼层的辅助方法// voidarrive(intfloor){// System.out.println("Theelevatorisgoingtothe"+getF100r()+”floor...");7
//this.floorfloor;//this.floorfloor;// )//GetterpublicStategetIdleState(){returnidleState;)publicStategetOpenOrCloseState(){returnopenOrCloseState;)publicStategetRunState(){returnrunState;)publicintgetCurrentF100r(){returncurrentFloor;)publicintgetDestinationF100r(){returndestinationFloor;)publicStategetState(){returnstate;)//toString()publicStringtoString(){\nCurrentreturn"ELEVATOR\n"+"CurrentFloor:"+getCurrentF100r()+State:"+getState()+"\n";\nCurrent))6.Scheduler/**对应GumballMachine@authorYilia*/publicclassScheduler{Elevatorelevator_1;Elevatorelevator_2;intfloor;publicScheduler(){elevator_1=newElevator();elevator_2=newElevator();)publicElevatorupOrDownButtonWasPushed(){if((elevator_1.getState()==elevator_1.getIdleState())&&(elevator_2.getState()==elevator_2.getIdleState())){//若都空闲,选择离得近的intcha_1=Math.abs(elevator_1.currentFloor-floor);intcha_2=Math.abs(elevator_2.currentFloor-floor);intmin=Math.min(cha_1,cha_2);if(min==cha_1){returnelevator_1;}else{returnelevator_2;}}elseif(elevator_1.getState()==elevator_1.getIdleState()){//1号电梯空闲returnelevator_1;}elseif(elevator_2.getState()==elevator_2.getIdleState()){//2号电梯空闲returnelevator_2;}else{System.out.println("Pleasewait.Allelevatorsarebasy!");returnnull;}}publicElevatorupOrDownButtonWasPushed(intfloor){this.floor=floor;if((elevator_1.getState()==elevator_1.getIdleState())&&(elevator_2.getState()==elevator_2.getIdleState())){//若都空闲,选择离得近的intcha_1=Math.abs(elevator_1.currentFloor-floor);intcha_2=Math.abs(elevator_2.currentFloor-floor);intmin=Math.min(cha_1,cha_2);if(min==cha1){elevator_1.upOrDownButtonWasPushed(floor);returnelevator_1;}else{elevator_2.upOrDownButtonWasPushed(floor);returnelevator_2;}}elseif(elevator_1.getState()==elevator_1.getIdleState()){//1号电梯空闲elevator_1.upOrDownButtonWasPushed(floor);returnelevator_1;}elseif(elevator_2.getState()==elevator_2.getIdleState()){//2号电梯空闲elevator_2.upOrDownButtonWasPushed(floor);returnelevator_2;}else{System.out.println("Pleasewait.Allelevatorsarebasy!");returnnull;}}publicvoidnumberButtonWasPushed(intdestinationFloor){if(upOrDownButtonWasPushed()!=null){upOrDownButtonWasPushed().numberButtonWasPushed(destinationFloor);}else{System.out.println("Pleasewait.Allelevatorsarebasy!");}}}7.PersonpublicclassPerson{Schedulerscheduler;publicPerson(Schedulerscheduler){this.scheduler=scheduler;}voidpushUpOrDownButton(intfloor){scheduler.upOrDownButtonWasPushed(floor);}voidpushNumberButton(intdestination){scheduler.numberButtonWasPushed(destination);;}}108.ClientpublicclassClient{publicstaticvoidmain(String[]aegs){Schedulerscheduler=newScheduler。;Personperson=newPerson(scheduler);person.pushUpOrDownButton(2);person.pushNumberButton(1);))运行结果:生问题叵Javadoc^声明且控制台滉|Client[1][Java A:\Java\jre\bin\javaw.exeYojplanedtneUpOrDownTheelevatorarriveatthe2floor.Thedoorisopen.Thedoorisclose.YojpushedtheNumberButton.Theelevatorarriveatt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广播电视机线员诚信模拟考核试卷含答案
- 磁头制造工5S执行考核试卷含答案
- 晶体切割工变更管理强化考核试卷含答案
- 化学计量员岗前基础在岗考核试卷含答案
- 增材制造设备操作员安全理论模拟考核试卷含答案
- 《零基础掌握环氧乙烷灭菌|护理操作标准化实训课件》
- 网版制版员客户服务测试考核试卷含答案
- 2026矿产企业面试题及答案
- 2026历城区语文面试题及答案
- 2026临聘书记员面试题及答案
- 晋升副高级安全管理职称工作总结范文
- 2025届河南省郑州市名校联考英语八年级第二学期期末复习检测试题含答案
- 比亚迪人事管理制度
- 环水保培训资料
- 苹果园防雹网设计及架设技术规程
- 【MOOC】智能采矿-河南理工大学 中国大学慕课MOOC答案
- 中辐放射性药物贮存及销售项目环评资料环境影响
- 50米钢烟囱制作安装施工方案
- 部编版七年级下册语文基础知识专项练习题100题(含答案)
- 人教版数学八年级下册《期末测试卷》含答案
- 武宣县泰龙矿业有限责任公司黄花锰矿矿山地质环境保护与土地复垦方案
评论
0/150
提交评论