命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

类图:

适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指定到一个不同的家电装置),每个插槽都有对应的开关按钮。这个遥控器还具备一个整体的撤销按钮。另外,多家厂商已经开发了一组Java类,例如电灯、风扇、热水器、音响设备和其他类似的可控制装置。遥控器如下图所示:

实现Code:

(1) 如下设备相关的Java类由厂商提供:

 1 //CeilingFan.java
 2 package RemoteControl.device;
 3
 4 public class CeilingFan {
 5     String name;
 6     public CeilingFan(String str)
 7     {
 8         name = str;
 9     }
10
11     public void on()
12     {
13         System.out.println(name + "CeilingFan On");
14     }
15
16     public void off()
17     {
18         System.out.println(name + "CeilingFan Off");
19     }
20 }

 1 //GarageDoor.java
 2 package RemoteControl.device;
 3
 4 public class GarageDoor {
 5     String name;
 6     public GarageDoor(String str)
 7     {
 8         name = str;
 9     }
10
11     public void up()
12     {
13         System.out.println(name + "GarageDoor On");
14     }
15
16     public void down()
17     {
18         System.out.println(name + "GarageDoor Off");
19     }
20 }

 1 //Light.java
 2 package RemoteControl.device;
 3
 4 public class Light {
 5     String name;
 6     public Light(String str)
 7     {
 8         name = str;
 9     }
10
11     public void on()
12     {
13         System.out.println(name + "Light On");
14     }
15
16     public void off()
17     {
18         System.out.println(name + "Light Off");
19     }
20 }

 1 //Stereo.java
 2 package RemoteControl.device;
 3
 4 public class Stereo {
 5     String name;
 6     public Stereo(String str)
 7     {
 8         name = str;
 9     }
10
11     public void on()
12     {
13         System.out.println(name + "Stereo On");
14     }
15
16     public void off()
17     {
18         System.out.println(name + "Stereo Off");
19     }
20
21     public void setCD()
22     {
23         System.out.println(name + "Stereo setCD");
24     }
25
26     public void setVolume(int num)
27     {
28         System.out.println(name + "Stereo setVolume:" + num);
29     }
30 }

(2) 将厂商提供的设备Java类库(即receiver)封装到Command类里面:

 1 //CeilingFanOffCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.CeilingFan;
 5
 6 public class CeilingFanOffCommand implements Command{
 7     CeilingFan cf;
 8
 9     public CeilingFanOffCommand(CeilingFan cf)
10     {
11         this.cf = cf;
12     }
13
14     @Override
15     public void execute()
16     {
17         cf.off();
18     }
19
20     @Override
21     public void undo() {
22         cf.on();
23     }
24
25 }

 1 //CeilingFanOnCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.CeilingFan;
 5
 6
 7 public class CeilingFanOnCommand implements Command{
 8     CeilingFan cf;
 9
10     public CeilingFanOnCommand(CeilingFan cf)
11     {
12         this.cf = cf;
13     }
14
15     @Override
16     public void execute()
17     {
18         cf.on();
19     }
20
21     @Override
22     public void undo() {
23         cf.off();
24     }
25 }

1 //Command.java
2 package RemoteControl.Command;
3
4 public interface Command {
5     public void execute();
6     public void undo();
7 }

 1 //GarageDoorDownCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.GarageDoor;
 5
 6 public class GarageDoorDownCommand implements Command {
 7     GarageDoor gd;
 8
 9     public GarageDoorDownCommand(GarageDoor gd)
10     {
11         this.gd = gd;
12     }
13
14     @Override
15     public void execute()
16     {
17         gd.down();
18     }
19
20     @Override
21     public void undo() {
22         gd.up();
23     }
24 }

 1 //GarageDoorUpCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.GarageDoor;
 5
 6 public class GarageDoorUpCommand implements Command {
 7     GarageDoor gd;
 8
 9     public GarageDoorUpCommand(GarageDoor gd)
10     {
11         this.gd = gd;
12     }
13
14     @Override
15     public void execute()
16     {
17         gd.up();
18     }
19
20     @Override
21     public void undo() {
22         gd.down();
23     }
24 }

 1 //LightOffCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.Light;
 5
 6 public class LightOffCommand implements Command {
 7     Light light;
 8
 9     public LightOffCommand(Light light)
10     {
11         this.light = light;
12     }
13
14     @Override
15     public void execute()
16     {
17         light.off();
18     }
19
20     @Override
21     public void undo() {
22         light.on();
23     }
24 }

 1 //LightOnCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.Light;
 5
 6 public class LightOnCommand implements Command {
 7
 8     Light light;
 9
10     public LightOnCommand(Light light)
11     {
12         this.light = light;
13     }
14
15     @Override
16     public void execute()
17     {
18         light.on();
19     }
20
21     @Override
22     public void undo() {
23         light.off();
24     }
25 }

 1 //NoCommand.java
 2 package RemoteControl.Command;
 3
 4 public class NoCommand implements Command{
 5     public void execute()
 6     {}
 7
 8     public void undo()
 9     {}
10 }

 1 //StereoOffCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.Stereo;
 5
 6 public class StereoOffCommand implements Command {
 7     Stereo stereo;
 8
 9     public StereoOffCommand(Stereo stereo)
10     {
11         this.stereo = stereo;
12     }
13
14     public void execute()
15     {
16         stereo.off();
17     }
18
19     @Override
20     public void undo() {
21         stereo.on();
22     }
23 }

 1 //StereoOnWithCDCommand.java
 2 package RemoteControl.Command;
 3
 4 import RemoteControl.device.Stereo;
 5
 6 public class StereoOnWithCDCommand implements Command {
 7     Stereo stereo;
 8
 9     public StereoOnWithCDCommand(Stereo stereo)
10     {
11         this.stereo = stereo;
12     }
13
14     public void execute()
15     {
16         stereo.on();
17         stereo.setCD();
18         stereo.setVolume(11);
19     }
20
21     @Override
22     public void undo() {
23         stereo.off();
24     }
25 }

(3) 实现Invoker类:

 1 //RemoteControl.java
 2 package RemoteControl;
 3
 4 import RemoteControl.Command.Command;
 5 import RemoteControl.Command.NoCommand;
 6
 7 public class RemoteControl {
 8     Command[] onCommands;
 9     Command[] offCommands;
10     Command undoCommand;
11
12     public RemoteControl(){
13         onCommands = new Command[7];
14         offCommands = new Command[7];
15
16         Command noCommand = new NoCommand();
17         for(int i=0; i<7; i++)
18         {
19             onCommands[i] = noCommand;
20             offCommands[i] = noCommand;
21         }
22         undoCommand = noCommand;
23     }
24
25     public void setCommand(int slot, Command onCommand, Command offCommand)
26     {
27         onCommands[slot] = onCommand;
28         offCommands[slot] = offCommand;
29     }
30
31     public void onButtonWasPushed(int slot)
32     {
33         onCommands[slot].execute();
34         undoCommand = onCommands[slot];
35     }
36
37     public void offButtonWasPushed(int slot)
38     {
39         offCommands[slot].execute();
40         undoCommand = offCommands[slot];
41     }
42
43     public void undoButtonWasPushed()
44     {
45         undoCommand.undo();
46     }
47
48     public String toString()
49     {
50         StringBuffer stringBuff = new StringBuffer();
51         stringBuff.append("\n-------- Remote Control --------\n");
52         for(int i = 0; i < onCommands.length; i++)
53         {
54             stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()
55                     + "    " + offCommands[i].getClass().getName() + "\n");
56         }
57         return stringBuff.toString();
58     }
59
60 }

 1 //RemoteControlTest.java
 2 package RemoteControl;
 3
 4 import RemoteControl.Command.CeilingFanOffCommand;
 5 import RemoteControl.Command.CeilingFanOnCommand;
 6 import RemoteControl.Command.GarageDoorDownCommand;
 7 import RemoteControl.Command.GarageDoorUpCommand;
 8 import RemoteControl.Command.LightOffCommand;
 9 import RemoteControl.Command.LightOnCommand;
10 import RemoteControl.Command.StereoOffCommand;
11 import RemoteControl.Command.StereoOnWithCDCommand;
12 import RemoteControl.device.CeilingFan;
13 import RemoteControl.device.GarageDoor;
14 import RemoteControl.device.Light;
15 import RemoteControl.device.Stereo;
16
17 public class RemoteControlTest {
18     public static void main(String[] args)
19     {
20         RemoteControl remoteControl = new RemoteControl();
21
22         Light livingRoomLight = new Light("Living Room");
23         Light kitchenLight = new Light("Kitchen");
24         CeilingFan ceilingFan = new CeilingFan("Living Room");
25         GarageDoor garageDoor = new GarageDoor("");
26         Stereo stereo = new Stereo("Living Room");
27
28         LightOnCommand lightRoomLightOn = new LightOnCommand(livingRoomLight);
29         LightOffCommand lightRoomLightOff = new LightOffCommand(livingRoomLight);
30
31         LightOnCommand kitchenLightOn = new LightOnCommand(kitchenLight);
32         LightOffCommand kitchenLightOff = new LightOffCommand(kitchenLight);
33
34         CeilingFanOnCommand ceilingFanOn = new CeilingFanOnCommand(ceilingFan);
35         CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan);
36
37         GarageDoorUpCommand garageDoorUp = new GarageDoorUpCommand(garageDoor);
38         GarageDoorDownCommand garageDoorDown = new GarageDoorDownCommand(garageDoor);
39
40         StereoOnWithCDCommand stereoOnWithCD = new StereoOnWithCDCommand(stereo);
41         StereoOffCommand stereoOff = new StereoOffCommand(stereo);
42
43         remoteControl.setCommand(0, lightRoomLightOn, lightRoomLightOff);
44         remoteControl.setCommand(1, kitchenLightOn, kitchenLightOff);
45         remoteControl.setCommand(2, ceilingFanOn, ceilingFanOff);
46         remoteControl.setCommand(3, garageDoorUp, garageDoorDown);
47
48         System.out.println(remoteControl);
49
50         remoteControl.onButtonWasPushed(0);
51         remoteControl.offButtonWasPushed(0);
52         remoteControl.onButtonWasPushed(1);
53         remoteControl.offButtonWasPushed(1);
54         remoteControl.onButtonWasPushed(2);
55         remoteControl.offButtonWasPushed(2);
56         remoteControl.onButtonWasPushed(3);
57         remoteControl.offButtonWasPushed(3);
58         remoteControl.undoButtonWasPushed();
59     }
60 }

实现类图:

转载于:https://www.cnblogs.com/Jerryli/p/3981098.html

[Head First设计模式笔记]----命令模式相关推荐

  1. 设计模式笔记-命令模式

    命令模式 最近在重新看设计模式,看了<Head First设计模式(中文版)>中的命令模式,跟上次刚入职看的感觉有点不一样,还是记录一下,便于以后查阅. 作用:将 动作的请求者 和 动作的 ...

  2. 设计模式 笔记 命令模式 Command

    //---------------------------15/04/25---------------------------- //Conmmand  命令模式----对象行为型模式 /* 1:意 ...

  3. 设计模式笔记——代理模式

    设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...

  4. 设计模式 之 命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...

  5. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  6. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  7. 设计模式学习笔记——命令模式(Command)

    1.特点:将请求发送者与具体实现者解耦,可对请求排列.取消.重做,支持事务.(多请求,单处理) 2.概念:属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transac ...

  8. 《Head First设计模式》第六章笔记-命令模式

    封装调用-命令模式 命令模式可将"动作的请求者"从"动作的执行者"对象中解耦. 本篇中将不再描述书中所引入的"巴斯特家电自动化公司"的遥控器 ...

  9. 设计模式学习笔记——命令模式

    请求发送者与请求接收者之间,隔着一个命令,这就是命令模式. 为什么要在中间搞一个命令对象作为中介? 请求发送者直接调用接收者不行吗?如果为方便替换,符合开闭原则,可以针对接口编程,弄一个请求接收者接口 ...

最新文章

  1. R语言绘制分块区域热力图
  2. 宜昌远安谋定功能性-农业大健康·万祥军:绿色和谐新路
  3. java异常基本知识
  4. ES6之let和const
  5. Prompt Learning | 一文带你概览Prompt工作新进展
  6. oracle 用户被锁定解决方法
  7. 基于Harry Potter的数据可视化
  8. 献给不知道自己该干什么的朋友—值得一看
  9. 变态矿工源码、闪电鸡app等软件的应用及发展方向的个人见解
  10. 我是个程序员,每天敲敲打打,哪天电脑崩溃了会发现我这辈子啥都没留下
  11. Minicom安装和使用和lte调试方法
  12. 什么游戏蓝牙耳机好用?性价比高的游戏蓝牙耳机推荐
  13. 关于CSI的一条龙服务
  14. Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法
  15. RFID建筑工地人员考勤管理解决方案——铨顺宏FUWIT
  16. 计算机组成原理-机器数、浮点数
  17. 如何让vs2019的主题变好看(NightOwl主题为例)???像vscode和webstorm一样自定义主题!!!
  18. 【计算机网络】思科实验(9):动态路由协议RIPv2
  19. linux系统一般用来干嘛
  20. 电脑重启bootmgr_电脑启动不了显示bootmgr

热门文章

  1. 2022年全球及中国商业净水器行业十四五运营方向与盈利前景分析报告
  2. 从上百幅架构图中学大型网站建设经验(上)
  3. mybatis-generator自动生成mapper
  4. Nuxt.js asyncData 多请求
  5. LeetCode:贪婪算法
  6. java基础—Hashtable,HashMap,TreeMap的差别
  7. Knockout v3.4.0 中文版教程-9-计算监控-API参考
  8. JMeter插件之 BlazeMeter's XMPP----测试Openfire等
  9. [再寄小读者之数学篇](2014-06-22 求导数 [中国科学技术大学2014年高等数学B考研试题])...
  10. 使用JavaScript调用aspx后台代码