设计模式(一):命令模式(2)——命令模式扩展之宏命令
前言
命令模式的讲解分为四篇:
设计模式(一):命令模式(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)——命令模式扩展之宏命令相关推荐
- 设计模式笔记之十四 (命令模式)
命令模式 命令模式是一种比较容易理解的设计模式,顾名思义,就是调用者发一个命令,有人给做完就行了,无关乎怎么做,也无关乎谁做. 我们继续我们以往的方式:理论联系实践的方式来理解命令模式. 最近我们实验 ...
- Java设计模式之行为型:命令模式
前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- Android 常用设计模式——观察者模式,单例模式,Builder模式,原型模式,命令模式
设计模式(Design pattern)是一套被反复使用的代码设计经验的总结.使用设计模式的目的是为了可重用代码让代码更容易被他人理解 设计模式的运用,有助于代码的维护与拓展.任何模式的出现,都是为了 ...
- 设计模式笔记十五:命令模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 命令模式(Command Pattern) 是一种数据驱动的设计模式,它 ...
- 设计模式(十三): 命令模式
命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...
- java execute 执行成功_【JAVA】设计模式之命令模式(Command模式)的使用分析
命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式. 首先看下GOF对命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录 ...
- 《设计模式详解》行为型模式 - 命令模式
命令模式 6.3 命令模式 6.3.1 概述 6.3.2 结构 6.3.3 案例实现 6.3.4 优缺点 6.3.5 使用场景 6.3.6 JDK 源码 - Runnable 完整的笔记目录:< ...
- C++设计模式 命令模式(服务员命令厨师)
文章目录 1. 基础知识 2. 逻辑代码 3. 应用 3.1 服务员命令厨师上菜 1. 基础知识 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式 ...
最新文章
- UVa11300 - Spreading the Wealth
- STL之hashtable源代码剖析
- 终极指南:如何使用Visual Studio Code进行 Java 开发?
- 都说现在的主流技术是Flink,那么让我们看看FLink在网易是如何实战的?
- C语言实现字符串匹配KMP算法
- 1036 跟奥巴马一起编程(15 分)
- 施一公:让科技工作成为富有吸引力的工作
- Java工作笔记-使用Hibernate连接mysql数据库并进行增、删、改、查!
- 面试题 08.02. 迷路的机器人
- L1-041 寻找250-PAT团体程序设计天梯赛GPLT
- 《编程之美》1.3一摞烙饼的排序
- hdu 1520 Anniversary party(第一道树形dp)
- 【干货】PyTorch Tricks 集锦
- 继电保护原理1.1-电流、方向保护
- VS+Qt应用开发-设置软件图标
- web前端开发师前景,96道前端面试题
- 推荐9个能让你看一天的网站
- 使用usb串口线作为console
- java解析HL7协议报文工具 HAPI(SpringBoot版本)
- 聚合广告SDK文档(Kotlin)