码迷,mamicode.com
首页 > 其他好文 > 详细

headFirst学习笔记之六:命令模式(4.30)

时间:2015-04-30 12:27:54      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:

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.七个插槽的遥控器:

 

headFirst学习笔记之六:命令模式(4.30)

标签:

原文地址:http://www.cnblogs.com/liyuhui21310122/p/4468434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!