这次来看下命令模式:

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

接下来,再来看下类图:

最后来看下代码:

public interface Command {void execute();void undo();
}

public class LightOffCommand implements Command {private Light light = new Light();public LightOffCommand() {this.light = light;}@Overridepublic void execute() {light.off();}@Overridepublic void undo() {light.on();}
}

  

public class LightOnCommand implements Command {private Light light = new Light();public LightOnCommand() {this.light = light;}@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}
}

public class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off");}
}

  

public class NoCommand implements Command {@Overridepublic void execute() {}@Overridepublic void undo() {}
}

  

public class StereoOffWithCDCommand implements Command {private Stereo stereo = new Stereo();public StereoOffWithCDCommand() {this.stereo = stereo;}@Overridepublic void execute() {stereo.off();}@Overridepublic void undo() {stereo.on();stereo.setCD();stereo.setVolume(11);}
}

  

public class StereoOnWithCDCommand implements Command {private Stereo stereo = new Stereo();public StereoOnWithCDCommand() {this.stereo = stereo;}@Overridepublic void execute() {stereo.on();stereo.setCD();stereo.setVolume(11);}@Overridepublic void undo() {stereo.off();}
}

  

public class Stereo {public void on() {System.out.println("Stereo is on");}public void setCD() {System.out.println("CD is set");}public void setVolume(int volume) {System.out.println("Volume is set " + volume);}public void off() {System.out.println("Stereo is off");}
}

  

public class RemoteControl {private Command[] onCommands;private Command[] offCommands;private Command undoCommand;public RemoteControl() {onCommands = new Command[2];offCommands = new Command[2];Command command = new NoCommand();for (int i = 0; i < 2; i++) {onCommands[i] = command;offCommands[i] = command;}undoCommand = command;}public void setCommand(int slot, Command onCommand, Command offCommand) {onCommands[slot] = onCommand;offCommands[slot] = offCommand;}public void onButtonWasPush(int slot) {onCommands[slot].execute();undoCommand = onCommands[slot];}public void offButtonWasPush(int slot) {offCommands[slot].execute();undoCommand = offCommands[slot];}public void undoButtonWasPushed() {undoCommand.undo();}@Overridepublic String toString() {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("\n------ Remote Control ------\n");for (int i = 0; i < onCommands.length; i++) {stringBuffer.append("[slot " + i + "] " + onCommands[i].getClass().getName() + "     " + offCommands[i].getClass().getName() + "\n");}return stringBuffer.toString();}
}

  

public class RemoteControlTest {public static void main(String[] args) {RemoteControl remte = new RemoteControl();LightOnCommand lightOnCommand = new LightOnCommand();LightOffCommand lightOffCommand = new LightOffCommand();StereoOnWithCDCommand onWithCDCommand = new StereoOnWithCDCommand();StereoOffWithCDCommand offWithCDCommand = new StereoOffWithCDCommand();remte.setCommand(0, lightOnCommand, lightOffCommand);remte.setCommand(1, onWithCDCommand, offWithCDCommand);System.out.println(remte.toString());remte.onButtonWasPush(0);remte.onButtonWasPush(1);remte.offButtonWasPush(0);remte.offButtonWasPush(1);remte.undoButtonWasPushed();}
}

  

  

  

转载于:https://www.cnblogs.com/shenqiaqia/p/11028496.html

设计模式——命令模式相关推荐

  1. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  2. 设计模式 命令模式 实例_根据您的命令-命令设计模式

    设计模式 命令模式 实例 命令设计模式是一种广为人知的设计模式,属于行为设计模式("四人帮"的一部分). 顾名思义,它与应用程序中的动作和事件有关. 问题陈述: 假设有一个网页将在 ...

  3. C语言设计模式——命令模式

    C语言设计模式--命令模式 好处:让代码清晰明了,容易添加和删除,易维护. 哪些地方会用到命令模式?(列出几个常见的例子) 1.按键处理,每个按键按下得到一个索引(指的就是命令),一个按键对应一个处理 ...

  4. C语言实现设计模式—命令模式

    文章目录 C语言设计模式--命令模式 传统的实现方式如下:(伪代码) 命令模式优化 UML 用例说明 实现流程 command.h command.c main 总结 C语言设计模式--命令模式 好处 ...

  5. 游戏设计模式 - 命令模式在Unity中的应用(C#)

    游戏设计模式 - 命令模式在Unity中的应用(C#) 实测:这是一篇简单易懂的文章-> https://zhuanlan.zhihu.com/p/46937284

  6. C++设计模式——命令模式(command pattern)

    一.原理讲解 别名动作(action),事务(transaction). 1.1意图 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作 ...

  7. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  8. 小菜学设计模式——命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 背景 外面小摊与店面的比较,你就会发现,店面似乎更加容易管理,为什么呢?因为在客户与老板自己新增了很多员工,这些员工各司其职, ...

  9. 设计模式 命令模式 之 管理智能家电

    继续设计模式哈,今天带来命令模式,二话不说,先看定义: 定义:将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 这尼玛定义,看得 ...

  10. 设计模式- 命令模式

    Gof定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 理解 对命令模式我有一些肤浅的认识,也许是不对的.但我还是写一下.其实在 ...

最新文章

  1. Python代码注释
  2. Python D6 if分支结构
  3. 全志 修改KEY Patch
  4. android点九,android关于点九(.9)图片
  5. MVC是一种用于表示层设计的复合设计模式
  6. 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)#华为云·寻找黑马程序员#
  7. itchat python_itchat-python搭建微信机器人(附示例)
  8. 【软件测试】导致软件缺陷的最大原因是软件需求规格说明书
  9. Python 命令的参数
  10. 如何选择深度学习框架 TensorFlow/Torch/Mxnet/Theano
  11. 2018-2019-1 20165307 20165327 20165332 实验二 固件程序设计
  12. 工作职位推荐系统的算法与架构
  13. 视频点播-上传视频状态异常
  14. Sofia-SIP辅助文档三 - 编码指南
  15. Java web 集成使用QQ互联
  16. stream().sorted 排序
  17. 写给父亲的语音计算器(‘(‘‘)‘算法参与运算c#,二)
  18. uvm学习笔记----适合新手快速学习
  19. 盘点那些没用的上网小技巧-如何直接从一个网页获取自己想要的音频
  20. seleniumbase学习总结4 - 运行测试用例

热门文章

  1. c语言二维数组错误语法,关于c语言动态分配二维数组free的错误求dalao看看怎么回事谢谢啊~~~~...
  2. java页面分页显示代码_通用分页jsp页面显示
  3. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
  4. python中seth是啥意思_python中的seth是什么意思
  5. php面向对象有哪三种访问控制模式,第三节 访问控制的实现
  6. 批量处理word文件内容_word文档批量处理大师
  7. [leetcode] 554. 砖墙
  8. python机器学习案例系列教程——集成学习(Bagging、Boosting、随机森林RF、AdaBoost、GBDT、xgboost)
  9. c#获取系统信息:CPU、内存、硬盘、用户、网络
  10. Quartus17报错Top-level design entity “dff“ is undefined的解决办法