您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 设计原则与设计模式_面向对象_10
设计原则与设计模式Command(命令)模式•给家庭影院配一个遥控器2Command(命令)模式•传统的想法:3Command(命令)模式•用户要求:按钮可以自定义4voidRemoteControl::Button1(){tv-On();}Command(命令)模式•例1:“魏延谋反”•诸葛亮在临死前给杨仪一个锦囊,密嘱:“我死,魏延必反,...那时自有斩魏延之人也”。同时授马岱以密计,只待魏延喊叫时,便出其不意斩之•后人有诗曰:“诸葛先机识魏延,已知日后反西川。锦囊遗计人难料,却见成功在马前”5Command(命令)模式•结构6Command(命令)模式•分析•锦囊是对命令的封装•诸葛亮是命令的设计者,他选择魏延作为命令的接收者•杨仪和马岱是命令的调用者,他们依据实际情况决定何时调用、是否调用命令•命令运行的结果就是使得命令的接收者魏延中计,并按照预谋落入陷阱7Command(命令)模式•分析•战场瞬息万变,孔明不能处处临场指挥•在这个故事里,命令模式把命令的设计者诸葛亮、调用者杨仪、马岱和执行者魏延完全分割开,互相可以灵活变化•命令由诸葛亮设计并封装,交由杨仪、马岱等待时机成熟时调用,调用结果就是命令的接收者魏延中计8•例2:餐厅的工作流程9顾客知道自己想要什么,并填写菜单服务员接过菜单交给厨师厨师根据菜单上的要求把饭菜做好菜单记录了顾客的要求Command(命令)模式•结构10Command(命令)模式•人物关系•顾客(Client):决定要点什么菜•点菜单(Command):封装了顾客的要求•服务员(Invoker):决定如何、何时将菜单送达•厨师(Receiver):顾客要求的接收者,是唯一知道如何做菜的11Command(命令)模式•运作过程:12•命令(Command):声明执行操作的接口•具体命令(ConcreteCommand):将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute()•客户(Client):创建具体命令对象并设定它的接收者•调用者(Invoker):要求该命令执行这个请求•接收者(Receiver):知道如何实施与执行一个请求相关的操作,任何类都可以作为一个接收者13Command(命令)模式•效果•可以很方便的增加新的命令•将调用操作的对象(Invoker)与知道如何实现该操作的对象(Receiver)解耦•将命令装配成对象,容易实现Undo/Redo和日志功能•可以实现事务管理:把多个命令合成为一个,相当于宏命令14Command(命令)模式•命令模式应用在遥控器上:15Command(命令)模式•效果•命令的调用者遥控器和执行者电视机等设备完全解耦•用户可以动态设置遥控器按钮的功能•这一切都不需要修改遥控器代码•做到了松散耦合,遵循了“开-闭”原则16Command(命令)模式•应用举例1:“刘备东吴招亲”•周瑜与孙权定下计谋,以孙权之妹为诱饵,骗刘备到东吴招亲,想趁机杀害刘备,索回荆州•诸葛亮早识破了诡计,令赵云护卫刘备前往,并给他三个锦囊,嘱咐他依次执行。结果,赵云按照诸葛亮的锦囊妙计行事,不仅帮助刘备将孙权之妹孙尚香夫人迎娶回来,还得到孙权之母吴国太的欢心,陪同刘备夫妇回了荆州•《三国演义》这段记叙,为后世创造了“锦囊妙计”和“赔了夫人又折兵”两个成语17Command(命令)模式•结构:18Command(命令)模式•分析•锦囊是对命令的封装•诸葛亮是命令的设计者,他选择赵云为接收者•赵云同时又是命令的调用者,他依据实际情况决定何时调用、是否调用命令•赵云作为命令的接收者,具体执行这个命令•在这个故事里,命令模式把命令的设计者诸葛亮、调用者赵云和执行者赵云完全分割开。命令由诸葛亮设计并封装,交由赵云调用,时机成熟时,赵云调用命令,再由自己去执行之19Command(命令)模式•应用举例2:“玉帝传美猴王上天”•玉帝命令太白金星召美猴王上天:“金星径入当中,面南立定道:‘我是西方太白金星,奉玉帝招安圣旨,下界请你上天,拜受仙录。’”•玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。果不然,不久美猴王就大闹了天宫。20Command(命令)模式•结构21遥控器实例•一个遥控器有七对开关按钮•每对按钮可以控制不同的装置,如灯,电视,影碟机等•这些装置来自不同的厂家,接口不同On(),off()Up(),down()…•还有一个整体的撤销按钮,会撤销最后一个按钮动作•我们不想让遥控器包含一大堆if语句2223CeilingFan**+++locationlevelHIGHMEDIUMLOW:String:int:int:int:int==2=1=0++++++ConstructorCeilingFan(Stringlocation)high()medium()low()off()getSpeed():void:void:void:void:intGarageDoor*location:String++++++ConstructorGarageDoor(Stringlocation)up()down()stop()lightOn()lightOff():void:void:void:void:voidHottub**ontemperature:boolean:int++++++++++ConstructorHottub()on()off()bubblesOn()bubblesOff()jetsOn()jetsOff()setTemperature(inttemperature)heat()cool():void:void:void:void:void:void:void:void:voidLight*location:String=+++ConstructorLight(Stringlocation)on()off():void:voidStereo*location:String+++++++ConstructorStereo(Stringlocation)on()off()setCD()setDVD()setRadio()setVolume(intvolume):void:void:void:void:void:voidTV**locationchannel:String:int++++ConstructorTV(Stringlocation)on()off()setInputChannel():void:void:void命令模式•命令模式可将“动作的请求者”从“动作的执行者”对象中解耦合•请求者可以是遥控器•执行者对象就是厂商类其中之一的实例24实现命令接口publicinterfaceCommand{publicvoidexecute();}25命令对象publicclassLightOnCommandimplementsCommand{Lightlight;publicLightOnCommand(Lightlight){this.light=light;}publicvoidexecute(){light.on();}}26使用命令对象publicclassSimpleRemoteControl{Commandslot;publicSimpleRemoteControl(){}publicvoidsetCommand(Commandcommand){slot=command;}publicvoidbuttonWasPressed(){slot.execute();}}27简单测试publicclassRemoteControlTest{publicstaticvoidmain(String[]args){SimpleRemoteControlremote=newSimpleRemoteControl();Lightlight=newLight();GarageDoorgarageDoor=newGarageDoor();LightOnCommandlightOn=newLightOnCommand(light);GarageDoorOpenCommandgarageOpen=newGarageDoorOpenCommand(garageDoor);remote.setCommand(lightOn);remote.buttonWasPressed();remote.setCommand(garageOpen);remote.buttonWasPressed();}}28定义命令模式Client+setCommand()Invoker+execute()+undo()接口Command+action()Receiver+execute()+undo()ConcreteCommand2930lightlight*onCommands*offCommandsCommand+execute():voidLight*location:String=+++ConstructorLight(Stringlocation)on()off():void:voidLightOffCommand*light:Light++ConstructorImplementLightOffCommand(Lightlight)execute():voidLightOnCommand*light:Light++ConstructorImplementLightOnCommand(Lightlight)execute():voidRemoteControl**onCommandsoffCommands:Command[]:Command[]+++++ConstructorRemoteControl()setCommand(intslot,CommandonCommand,CommandoffCommand)onButtonWasPushed(intslot)offButtonWasPushed(intslot)toString():void:void:void:StringRemoteLoader+main(Stringargs[]):void实现遥控器publicclassRemoteControl{Command[]onCommands;Command[]offCommands;publicRemoteControl(){onCommands=newCommand[7];offCommands=newCommand[7];CommandnoCommand=newNoCommand();for(inti=0;i7;i++){onCommands[i]=noCommand;offCommands[i]=noCommand;}}31实现遥控器publicvoidsetCommand(intslot,CommandonCommand,CommandoffCommand){onCommands[slot]=onCommand;offCommands[slot]=offCommand;}publicvoidonButtonWasPushed(intslot){onCommands[slot].execute();}publicvoidoffButtonWasPushed(intslot){offCommands[slot].execute();}32实现遥控器publicclassRemoteLoader{publicstaticvoidmain(String[]args){RemoteControlremoteControl=newRemoteControl();LightlivingRoomLight=newLight(LivingRoom);Lig
本文标题:设计原则与设计模式_面向对象_10
链接地址:https://www.777doc.com/doc-3095434 .html