命令模式.ppt
《命令模式.ppt》由会员分享,可在线阅读,更多相关《命令模式.ppt(41页珍藏版)》请在三一办公上搜索。
1、命令模式,将把封装带到一个全新的境界:把方法调用(method invocation)封装起来通过封装方法调用,可以把运算块包装成形通过封装方法调用,也可以做一些很聪明的事情,例如记录日志,或者重复使用这些封装来实现撤销(undo),封装调用,巴斯特家电自动化公司,设计一个家电自动化遥控器的API附上一个创新控制器的原型以供研究这个遥控器具有7个可编程的插槽(每个都可以指定到一个不同的家电装置)每个插槽都有对应的开关按钮这个遥控器还具备一个整体的撤销按钮在光盘里附上有一组Java类,这些类是由多家厂商开发出来的,用来控制家电自动化装置,例如电灯、风扇、热水器、音响设备和其他类似的可控制装置希望
2、能够创建一组控制遥控器的API,让每个插槽都能够控制一个或一组装置,让硬件解脱!让我们看看这个遥控器,看一下厂商的类,思考,目前有一个附着开和关按钮的简单遥控器,还有一套五花八门的厂商类有许多类都具备on()和off()方法,除此之外,还有一些方法像是dim(),setTemperature(),setVolumn(),setDirection()要把它看成分离的关注点:遥控器应该知道如何解读按钮被按下的动作,然后发出正确的请求,但是遥控器不需知道这些家电自动化的细节,或者如何打开热水器但如果遥控器很笨,只知道如何做出一般的要求,那又怎能设计出让这个遥控器能够调用一些诸如打开电灯或车库门的动作
3、?,不必让遥控器知道太多厂商类的细节不想让遥控器包含一大堆if语句,例如“if slot1=Light,then light.on(),else if slot1=Hottub then hottob.jetsOn()”如果这样设计的话,只要有新的厂商类进来,就必须修改代码命令模式可将“动作的请求者”从“动作的执行者”对象中解耦,请求者可以是遥控器,而执行者对象就是厂商类其中之一的实例,在设计中采用“命令对象”。利用它,把请求(例如打开电灯)封装成一个特定对象(例如客厅电灯对象)。如果对每个按钮都存储一个命令对象,那么当按钮被按下时,就可以请命令对象做相关的工作遥控器并不需要知道工作内容是什么
4、,只要有个命令对象能和正确的对象沟通使用模式,能够创建一个API,将这些命令对象加载到按钮插槽,让遥控器的代码尽量保持简单。而把家电自动化的工作和进行该工作的对象一起封装在命令对象中这个模式可以同时设计“撤销按钮”,餐厅,餐厅的角色和职责,一张订单封装了准备餐店的请求把订单想象成一个用来请求准备餐点的对象,和一般的对象一样,订单对象可以被传递:从女招待传递到订单柜台,或者从女招待传递到接替下一班的女招待订单的接口只包含一个方法,也就是orderUp()这个方法封装了准备餐点所需的动作订单内有一个到“需要进行准备工作的对象”(也就是厨师)的引用这一切都被封装起来,所以女招待不需要知道订单上有什么
5、,也不需要知道是谁来准备餐点;她只需要将订单放到订单窗口,然后喊一声“订单来了”就可以了,女招待的工作是接受订单,然后调用订单的orderUp()方法女招待的工作很简单:接下顾客的订单,继续帮助下一个顾客,然后将一定数量的订单放到订单柜台,并调用orderUp()方法,让人来准备餐点女招待其实不必担心订单的内容是什么,或者由谁来准备餐点她只需要知道,订单有一个orderUp()方法可以调用现在,一天内,不同的顾客有不同的订单,这会使得女招待的takeOrder()方法被传入不同的参数女招待知道所有的订单都支持orderUp()方法,任何时候她需要准备餐点时,调用这个方法,快餐厨师具备准备餐点的
6、知识,快餐厨师是一种对象,他真正知道如何准备餐点一旦女招待调用orderUp()方法,快餐厨师就接手,实现需要创建餐点的所有方法请注意,女招待和厨师之间是彻底的解耦:女招待的订单封装了餐点的细节,她只要调用每个订单的方法即可,而厨师看了订单就知道该做些什么餐点;厨师和女招待之间从来不需要直接沟通,重点,把餐厅想成是OO设计模式的一种模型,而这个模型允许将“发出请求的对象”和“接受与执行这些请求的对象”分隔开来对于遥控器API,我们需要分隔开“发出请求的按钮代码”和“执行请求的厂商特定对象”万一遥控器的每个插槽都持有一个像餐厅订单那样的对象,会怎么样?那么,当一个按钮被按下,只要调用该对象的or
7、derUp()方法,电灯就开了,而遥控器不需要知道事情是怎么发生的,也不需要知道涉及哪些对象现在我们就把餐厅的对话换成命令模式,从餐厅到命令模式,加载调用者,客户创建一个命令对象客户利用setCommand()将命令对象储存在调用者中稍后客户要求调用者执行命令。请注意:一旦命令被加载到调用者,该命令可以被使用并丢弃,或者可以被保留下来并使用许多次,连连看,餐厅命令模式,女招待Command快餐厨师execute()orderUp()Client订单Invoker顾客ReceivertakeOrder()setCommand(),第一个命令对象,实现命令接口(餐厅例子中是orderUp(),现在
8、改为惯用名称execute)public interface Command public void execute();实现一个打开电灯的命令现在,假设想实现一个打开电灯的命令。根据厂商所提供的类,public class LightOffCommand implements Command Light light;public LightOffCommand(Light light)this.light=light;public void execute()light.off();,使用命令对象,让我们把这一切简化:假设我们有一个遥控器,它只有一个按钮和对应的插槽,可以控制一个装置publ
9、ic class SimpleRemoteControl Command slot;public SimpleRemoteControl()public void setCommand(Command command)slot=command;public void buttonWasPressed()slot.execute();,遥控器使用的简单测试,public class RemoteControlTest public static void main(String args)SimpleRemoteControl remote=new SimpleRemoteControl();L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 命令 模式
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2383054.html