标签:
1.要完成的任务:
目标:设计一个家电自动化遥控器的API,让每个插槽都能控制一个或者一组装置。能够控制目前的装置和任何未来可能出现的装置这一点非常重要。
已知条件:
(1)这个遥控器有7个可编程的插槽(每个都可以指定到一个不同的家电装置),每个插槽都有对应的开关按钮。这个遥控器还具备一个整体的撤销按钮。
(2)提供一个光盘,里面是厂商类,用来控制家电自动化装置,比如电灯、风扇、热水器等可控制装置。部分如下所示,类不少,接口也各有差异。
1 class TV{ 2 on(){} 3 off(){} 4 setInputChannel(){} 5 setVolume(){} 6 } 7 8 class CeilingLight{ 9 on(){} 10 off(){} 11 dim(){} 12 } 13 14 class Sprinkler{ 15 waterOn(){} 16 waterOff(){} 17 } 18 19 class SecurityControl{ 20 arm(){} 21 disarm(){} 22 } 23 24 ...
2.对任务的思考:
(1)不能让遥控器知道太多厂商类的细节,不能让它有下面的语句。这样的话,只要有新的厂商类进来,我们就要修改原来的代码,无休无尽,而且可能会造成潜在的错误。
1 if(slot1 == Light){ 2 light.on(); 3 }else if(slot1 == Hottub){ 4 hottob.jetsOn(); 5 }...
(2)也就是说要将“动作的请求者”从“动作的执行者”对象中解耦。在这里,动作的请求者就是遥控器,动作的执行者就是各种厂商类之一的实例。即可以采用命令模式:控制器并不需要知道工作内容是什么,只要有个命令对象能和正确的对象沟通即可。
(a)那么,在对象村(嫌弃脸)餐厅,这个模式的应用是很明显的:you(顾客)写好订单交给女招待 --->女招待拿到订单交给厨师---> 厨师根据订单做菜。
每一份订单都看做一个对象,从顾客传递到女招待,再传递到厨师。订单里只有一个方法:orderUp(),用来封装准备这份订单的东西所需的动作。而女招待不需要知道里面是什么,她只需要拿走订单,然后喊一声订单来了(即调用orderUp()方法)。然后orderUp里会有对厨师的引用,调用厨师的makeBurger()方法。createOrder() --> takeOrder() --> orderUp() --> makeBurger() --> output
1 public void orderUp(){ 2 cook.makeBurger(); 3 cook.makeShake(); 4 }
(b)让我们从餐厅跳出来,把上面的问题抽象。
顾客创建一份订单:client createCommandObject() --> 订单里面orderUp方法,封装了准备这份订单要的动作:command里有execute() --> 女招待拿走订单:Invoker setCommand() --> 女招待大喊一声订单来了:调用command.execute() --> 厨师接单开始劳作:execute里面调用receiver.action()
3.完成第一个命令对象:假设我们的遥控器只有一个按钮和对应的插槽。
1 public interface Command(){ 2 public void excute(); 3 }
1 public class LightOnCommand implements Command{ 2 Light light; 3 public LightOnCommand(Light light){ 4 this.light = light; 5 } 6 public void execute(){ 7 light.on(); 8 } 9 }
1 public class SimpleRemoteControl{ 2 Command slot; 3 public SimplerRemoteControl(){} 4 5 public void setCommand(Command command){ 6 slot = command; 7 } 8 public void ButtonWasPressed(){ 9 slot.execute(); 10 } 11 }
1 public class RemoteControlTest{ 2 public void main(String[] args){ 3 //电灯是接收者receiver,会执行开灯和关灯的命令 4 Light light = new Light(); 5 LightOnCommand lightOn = new LightOnCommand(light); 6 //遥控器是调用者invoker,会传入一个命令对象setCommand,也可以发出请求ButtonWasPressed 7 SimpleRemoteControl remote = new SimpleRemoteControl(); 8 remote.setCommand(lightOn); 9 remote.ButtonWasPressed(); 10 } 11 }
4.七个插槽的遥控器:
标签:
原文地址:http://www.cnblogs.com/liyuhui21310122/p/4468434.html