版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件构造第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考物理复习主题单元4第8课时熟悉而陌生的力课件
- 冀少版八年级生物上册第三单元第二节蒸腾作用课件
- 等高线地形图教案
- 《蚂蚁搬豆》体育游戏
- 人教版一年级数学上册【教案全册】
- 旅游景区酒店建设承揽
- 西师版五年级语文上册教案
- 人教版三年级语文上册教案
- 乐器制品标识制度
- 老年护理中心财务流程
- 中国中煤华东分公司招聘笔试题库2024
- 炎德英才大联考2025届高三第二次模拟考试物理试卷含解析
- 幼儿园中班社会《兔子先生去散步》课件
- 人教课标解析新时代教育理念
- 2023年12月英语四级真题及答案-第2套
- 品牌授权收费合同模板
- DB41-T 2689-2024 水利工程施工图设计文件编制规范
- 【学案】夏商周时期的科技与文化导学案 2024~2025学年统编版七年级历史上册
- 空气动力学数值方法:有限体积法(FVM):离散化技术与数值通量
- 北师大版九年级物理全一册电子课本教材
- 生产管理培训课件
评论
0/150
提交评论