欢迎来到天天文库
浏览记录
ID:38725862
大小:1.56 MB
页数:43页
时间:2019-06-18
《《命令模式》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第十一章命令模式家电自动化遥控器的API遥控器有七个可编程的插槽(每个控制一个不同的家电自动化装置),每个插槽有对应的开(on)/关(off)按钮;有一个撤消(undo)按钮。有一组Java类,这些类是由多家厂商开发出来的,用来控制家电装置,例如电灯、风扇、热水器、音响设备等。1遥控器2厂商类喷头立体声音响水龙头热水器恒温器厨具控制3家电自动化遥控器的API(续)目标:创建一组控制遥控器的API,每个插槽能控制一个或一组装置(包括目前的装置和未来可能的装置)。问题:有许多厂商类,每个类有各自的操作。遥控器应
2、该怎样解读按钮被按下的动作?解决方法:采用“命令对象”封装动作请求。当按钮按下时,请命令对象做相关的工作。让“动作的请求者(遥控器)”从“动作的执行者(厂商类之一的实例)”对象中解耦。4餐厅订餐5更详细地研究刚才的交互过程。6从餐厅到命令模式与订餐过程的略微不同之处:客户一般不会直接指定厨师。7实现命令接口所有的命令对象实现相同的包含一个方法的接口。在餐厅中,此方法为orderUp(),命令对象中惯用名称execute()。publicinterfaceCommand{publicvoidexecute()
3、;}只有这一个方法。8实现一个打开电灯的命令根据厂商提供的类,light有两个方法:on()和off()。publicclassLightOnCommandimplementsCommand{Lightlight;publicLightOnCommand(Lightlight){this.light=light;}publicvoidexecute(){light.on();}}9使用命令对象假定遥控器只有一个按钮和对应的插槽:publicclassSimpleRemoteControl(){Command
4、slot;publicSimpleRemoteControl(){}publicvoidsetCommand(Commandcommand){slot=command;}publicvoidbuttonWasPressed(){slot.execute();}}设置插槽控制的命令。如果要改变遥控器的行为,可以重复调用这个方法。遥控器的角色是“调用者”。10遥控器使用的简单测试publicclassRemoteControlTest{publicclassstaticvoidmain(String[]args
5、){SimpleRemoteControlremote=newSimpleRemoteControl();Lightlight=newLight();LightOnCommandlightOn=newLightOnCommand(light);remote.setCommand(lightOn);remote.buttonWasPressed();}}}客户调用者创建一个命令对象接收者命令传给调用者调用者执行命令11命令模式定义利用命令来参数化对象。遥控器对象并不关心是什么命令对象,只要该命令对象实现了Co
6、mmand接口即可。命令模式也可以实现队列、日志和撤消操作。12命令模式类图13将命令指定到插槽将遥控器的每个插槽,对应到一个命令,把遥控器变成“调用者”。当按下按钮,相应命令对象的execute()方法就会被调用,使得接收者的动作被调用。1415实现遥控器publicclassRemoteControl{Command[]onCommands;Command[]offCommands;publicRemoteControl(){onCommands=newCommand[7];offCommands=ne
7、wCommand[7];CommandnoCommand=newNoCommand();for(inti=0;i<7;i++){onCommands[i]=noCommand;offCommands[i]=noCommand;}}publicvoidsetCommand(intslot,CommandonCommand,CommandoffCommand){onCommands[slot]=onCommand;offCommands[slot]=offCommand;}16实现遥控器(续)publicvoi
8、donButtonWasPushed(intslot){onCommands[slot].execute();}publicvoidoffButtonWasPushed(intslot){offCommands[slot].execute();}publicStringtoString(){//覆盖toString(),打印出每个插槽和它对应的命令。StringBufferstringBuff=newString
此文档下载收益归作者所有