前言

命令模式的讲解分为四篇:

设计模式(一):命令模式(1)——基本的命令模式

设计模式(一):命令模式(2)——命令模式扩展之宏命令

设计模式(一):命令模式(3)——命令模式扩展之队列请求

设计模式(一):命令模式(4)——命令模式扩展之日志请求

一、升级遥控器

1.需求

经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能。但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯、空调、洗衣机打开,按下0号插槽的Off按钮时就可以将电灯、空调、洗衣机关闭,按下undo按钮时就可以将这一系列的命令撤销掉。也就是说我们需要遥控器按钮实现宏命令。

2.实现

代码地址:https://github.com/wutianqi/desin-patterns/tree/master/design-pattern/src/main/java/com/wutqi/p1/command_pattern/p2/macro

要让遥控器按钮实现宏命令,那么按钮所发出的宏命令中的动作的执行者就是一系列命令的集合。撤销命令也是一个宏命令,里面动作的执行者也是一个宏命令。让我i们来看下代码实现。

**************MacroCommand******************

/*** 宏命令* @author wuqi* @Date 2019/1/29 17:44*/
public class MacroCommand implements Command {private List<Command> commands;public MacroCommand(List<Command> commands){this.commands = commands;}@Overridepublic void execute() {for(Command command : commands){command.execute();}}@Overridepublic void undo() {for(int i=commands.size() - 1;i>=0;i--){commands.get(i).undo();}}
}

**************RemoteControlTest******************

/*** 宏命令测试* @author wuqi* @Date 2019/1/29 17:49*/
public class RemoteControlTest {public static void main(String[] args) {//创建电器Light livingRoomLight = new Light();AirCondition airCondition = new AirCondition();Refrigerator refrigerator = new Refrigerator();//创建宏命令并将其设置到遥控器中LightOnCommand lightOnCommand = new LightOnCommand(livingRoomLight);LightOffCommand lightOffCommand = new LightOffCommand(livingRoomLight);AirConditionOnCommand airConditionOnCommand = new AirConditionOnCommand(airCondition);AirConditionOffCommand airConditionOffCommand = new AirConditionOffCommand(airCondition);RefrigeratorOnCommand refrigeratorOnCommand = new RefrigeratorOnCommand(refrigerator);RefrigeratorOffCommand refrigeratorOffCommand = new RefrigeratorOffCommand(refrigerator);List<Command> onCommands = new ArrayList<>();onCommands.add(lightOnCommand);onCommands.add(airConditionOnCommand);onCommands.add(refrigeratorOnCommand);List<Command> offCommands = new ArrayList<>();offCommands.add(lightOffCommand);offCommands.add(airConditionOffCommand);offCommands.add(refrigeratorOffCommand);MacroCommand onMacroCommand = new MacroCommand(onCommands);MacroCommand offMacroCommad = new MacroCommand(offCommands);RemoteControl remoteControl = new RemoteControl();remoteControl.setCommand(0,onMacroCommand,offMacroCommad);//打开电灯,打开空调,打开冰箱remoteControl.onButtonPushed(0);//关上电灯,关上空调,关掉冰箱remoteControl.offButtonPushed(0);//撤销
        remoteControl.undo();}
}

运行结果如下:

从运行结果我们看到遥控器的0号插槽的on和off按钮实现了开和关的宏命令,撤销按钮也成功撤销了之前执行的宏命令。

二、总结

由改造的遥控器的案例中,我们看到命令模式支持宏命令来实现一组动作。这也是命令模式的优点所在。

转载于:https://www.cnblogs.com/wutianqi/p/10335613.html

设计模式(一):命令模式(2)——命令模式扩展之宏命令相关推荐

  1. 设计模式笔记之十四 (命令模式)

    命令模式 命令模式是一种比较容易理解的设计模式,顾名思义,就是调用者发一个命令,有人给做完就行了,无关乎怎么做,也无关乎谁做. 我们继续我们以往的方式:理论联系实践的方式来理解命令模式. 最近我们实验 ...

  2. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

  3. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  4. Android 常用设计模式——观察者模式,单例模式,Builder模式,原型模式,命令模式

    设计模式(Design pattern)是一套被反复使用的代码设计经验的总结.使用设计模式的目的是为了可重用代码让代码更容易被他人理解 设计模式的运用,有助于代码的维护与拓展.任何模式的出现,都是为了 ...

  5. 设计模式笔记十五:命令模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 命令模式(Command Pattern) 是一种数据驱动的设计模式,它 ...

  6. 设计模式(十三): 命令模式

    命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...

  7. java execute 执行成功_【JAVA】设计模式之命令模式(Command模式)的使用分析

    命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式. 首先看下GOF对命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录 ...

  8. 《设计模式详解》行为型模式 - 命令模式

    命令模式 6.3 命令模式 6.3.1 概述 6.3.2 结构 6.3.3 案例实现 6.3.4 优缺点 6.3.5 使用场景 6.3.6 JDK 源码 - Runnable 完整的笔记目录:< ...

  9. C++设计模式 命令模式(服务员命令厨师)

    文章目录 1. 基础知识 2. 逻辑代码 3. 应用 3.1 服务员命令厨师上菜 1. 基础知识 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式 ...

最新文章

  1. UVa11300 - Spreading the Wealth
  2. STL之hashtable源代码剖析
  3. 终极指南:如何使用Visual Studio Code进行 Java 开发?
  4. 都说现在的主流技术是Flink,那么让我们看看FLink在网易是如何实战的?
  5. C语言实现字符串匹配KMP算法
  6. 1036 跟奥巴马一起编程(15 分)
  7. 施一公:让科技工作成为富有吸引力的工作
  8. Java工作笔记-使用Hibernate连接mysql数据库并进行增、删、改、查!
  9. 面试题 08.02. 迷路的机器人
  10. L1-041 寻找250-PAT团体程序设计天梯赛GPLT
  11. 《编程之美》1.3一摞烙饼的排序
  12. hdu 1520 Anniversary party(第一道树形dp)
  13. 【干货】PyTorch Tricks 集锦
  14. 继电保护原理1.1-电流、方向保护
  15. VS+Qt应用开发-设置软件图标
  16. web前端开发师前景,96道前端面试题
  17. 推荐9个能让你看一天的网站
  18. 使用usb串口线作为console
  19. java解析HL7协议报文工具 HAPI(SpringBoot版本)
  20. 聚合广告SDK文档(Kotlin)

热门文章

  1. VC++ | DLL的创建和使用
  2. (五)EDCA机制详解
  3. ROS个别命令的使用 ros ros2
  4. 电脑mysql 安装方法_mysql安装图解 windows安装mysql方法
  5. hfs文件服务器使用
  6. 玩了下体像素软件MagicaVoxel
  7. Node.js简介、安装Node.js、ES6中的模块
  8. c语言编译器mingw——常用编译命令
  9. windows下Redis-cluster集群搭建
  10. vba操作IE浏览器