本文示例代码材料源自Head First设计模式
以前整理自己整理的链接:
https://blog.csdn.net/u011109881/article/details/59675658

极简命令模式示例代码

命令类:

public interface Command {public void execute();
}
public class LightOnCommand implements Command{Light light;public LightOnCommand(Light light) {this.light = light;}public void execute() {light.on();}}

bean:

public class Light {String name;public Light(String name) {this.name = name;}public void on() {System.out.println(name+" light on");}public void off() {System.out.println(name +" light off");}
}
public class SimpleRemoteControl {Command comm;public SimpleRemoteControl() {}public void setCommand(Command comm){this.comm = comm;}public void buttonWasPressed(){comm.execute();}}

测试类:

public class Test {public static void main(String[] args) {SimpleRemoteControl control = new SimpleRemoteControl();Command comm = new LightOnCommand(new Light("白炽灯"));control.setCommand(comm);control.buttonWasPressed();}
}

示例思路(类图)


解析

将命令封装成对象,传给遥控器,遥控器可以通过命令操作其他事物。
主要角色:
被操控者(例如灯对象) 命令对象(例如开灯命令 关灯命令) 操控者(遥控器)
三者关系:
创建命令对象时,包含了被操控者的实例;创建操控者时,包含了命令对象的实例。因此,操控者和被操控者实现了间接依赖,即,操控者和被操控者实现了解耦。

命令模式升级 遥控器功能丰富化 添加撤销功能

首先,对SimpleRemoteControl类稍作修改,让他可以有很多命令

public class SimpleRemoteControl {List<Command> onCommandList;List<Command> offCommandList;Command undoCmmand;public SimpleRemoteControl() {onCommandList = new ArrayList<Command>();offCommandList = new ArrayList<Command>();}public void addCommand(Command onComm,Command offComm){onCommandList.add(onComm);offCommandList.add(offComm);}public void onButtonWasPressed(int pos){if(pos < onCommandList.size() ){onCommandList.get(pos).execute();undoCmmand = onCommandList.get(pos);}else{System.out.println("pos out of on index");}}public void offButtonWasPressed(int pos){if(pos < offCommandList.size()){offCommandList.get(pos).execute();undoCmmand = offCommandList.get(pos);}else{System.out.println("pos out of off index");}}public void undoButtonPressed(){undoCmmand.undo();}@Overridepublic String toString() {Iterator<Command> onIterator = onCommandList.iterator();Iterator<Command> offIterator = offCommandList.iterator();while(onIterator.hasNext()){System.out.println(onIterator.next().getClass().getName());}while(offIterator.hasNext()){System.out.println(offIterator.next().getClass().getName());}return super.toString();}}

其次,添加一些可操控类

public class Stereo {int volume;public void on(){System.out.println("Stereo on");}public void off(){System.out.println("Stereo off");}public void setCD() {System.out.println("setCD");}public void setVolume(int volume) {System.out.println("setVolume "+volume);this.volume = volume;}}

然后,修改命令类,添加undo方法

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

再者,添加一些命令并实现undo

public class LightOffCommand implements Command{Light light;public LightOffCommand(Light light) {this.light = light;}public void execute() {light.off();}public void undo() {System.out.println("undo light off");light.on();}}
public class LightOnCommand implements Command{Light light;public LightOnCommand(Light light) {this.light = light;}public void execute() {light.on();}public void undo() {System.out.println("undo light on");light.off();}}
public class StereoOffCommand implements Command{Stereo stereo;public StereoOffCommand(Stereo stereo) {this.stereo = stereo;}public void execute() {stereo.off();}public void undo() {System.out.println("undo stereo off");  stereo.on();stereo.setCD();stereo.setVolume(11);}
}
public class StereoOnCommand implements Command{Stereo stereo;public StereoOnCommand(Stereo stereo) {this.stereo = stereo;}public void execute() {stereo.on();stereo.setCD();stereo.setVolume(11);}public void undo() {System.out.println("undo stereo on");stereo.off();}}

最后,修改测试类

public class Test {public static void main(String[] args) {SimpleRemoteControl control = new SimpleRemoteControl();Light light1 = new Light("厨房的白炽灯");Light light2 = new Light("卧室的小夜灯");Light light3 = new Light("客厅的水晶灯");Stereo stereo = new Stereo();Command commOn1 = new LightOnCommand(light1);Command commOn2 = new LightOnCommand(light2);Command commOn3 = new LightOnCommand(light3);Command commOff1 = new LightOffCommand(light1);Command commOff2 = new LightOffCommand(light2);Command commOff3 = new LightOffCommand(light3);Command commOn4 = new StereoOnCommand(stereo);Command commOff4 = new StereoOffCommand(stereo);control.addCommand(commOn1, commOff1);control.addCommand(commOn2, commOff2);control.addCommand(commOn3, commOff3);control.addCommand(commOn4, commOff4);control.toString();System.out.println("-----");control.onButtonWasPressed(0);control.onButtonWasPressed(1);control.onButtonWasPressed(2);control.onButtonWasPressed(3);control.onButtonWasPressed(11);control.offButtonWasPressed(0);control.undoButtonPressed();control.offButtonWasPressed(1);control.undoButtonPressed();control.offButtonWasPressed(2);control.undoButtonPressed();control.offButtonWasPressed(3);control.undoButtonPressed();control.offButtonWasPressed(14);}
}

升级版类图


忘记加undo方法了0.0
这里的undo并不完善,只记住了最后一步操作,这里可以将执行的操作放入栈中,执行undo时弹出。
测试结果:

com.demo.LightOnCommand
com.demo.LightOnCommand
com.demo.LightOnCommand
com.demo.StereoOnCommand
com.demo.LightOffCommand
com.demo.LightOffCommand
com.demo.LightOffCommand
com.demo.StereoOffCommand
-----
厨房的白炽灯 light on
卧室的小夜灯 light on
客厅的水晶灯 light on
Stereo on
setCD
setVolume 11
pos out of on index
厨房的白炽灯 light off
undo light off
厨房的白炽灯 light on
卧室的小夜灯 light off
undo light off
卧室的小夜灯 light on
客厅的水晶灯 light off
undo light off
客厅的水晶灯 light on
Stereo off
undo stereo off
Stereo on
setCD
setVolume 11
pos out of off index

命令模式的批处理

看名字好像听玄乎,其实就是一个命令其实执行了好几个操作,就像stereo的on方法其实执行好几个操作。
1.添加批处理命令

public class ServeralCommand implements Command{List<Command> commands;public ServeralCommand(List<Command> comms) {this.commands = comms;}public void execute() {Iterator<Command> iterator = commands.iterator();while(iterator.hasNext()){iterator.next().execute();}}public void undo() {Iterator<Command> iterator = commands.iterator();while(iterator.hasNext()){iterator.next().undo();}}}

2.修改测试类

        SimpleRemoteControl control = new SimpleRemoteControl();Light light1 = new Light("厨房的白炽灯");Light light2 = new Light("卧室的小夜灯");Light light3 = new Light("客厅的水晶灯");Stereo stereo = new Stereo();Command commOn1 = new LightOnCommand(light1);Command commOn2 = new LightOnCommand(light2);Command commOn3 = new LightOnCommand(light3);Command commOff1 = new LightOffCommand(light1);Command commOff2 = new LightOffCommand(light2);Command commOff3 = new LightOffCommand(light3);Command commOn4 = new StereoOnCommand(stereo);Command commOff4 = new StereoOffCommand(stereo);ArrayList<Command> onComms = new ArrayList<Command>();onComms.add(commOn1);onComms.add(commOn2);onComms.add(commOn3);onComms.add(commOn4);ServeralCommand onComm = new ServeralCommand(onComms);ArrayList<Command> offComms = new ArrayList<Command>();offComms.add(commOff1);offComms.add(commOff2);offComms.add(commOff3);offComms.add(commOff4);ServeralCommand offComm = new ServeralCommand(offComms);control.addCommand(onComm, offComm);control.onButtonWasPressed(0);control.offButtonWasPressed(0);control.undoButtonPressed();

3.测试结果

厨房的白炽灯 light on
卧室的小夜灯 light on
客厅的水晶灯 light on
Stereo on
setCD
setVolume 11
厨房的白炽灯 light off
卧室的小夜灯 light off
客厅的水晶灯 light off
Stereo off
undo light off
厨房的白炽灯 light on
undo light off
卧室的小夜灯 light on
undo light off
客厅的水晶灯 light on
undo stereo off
Stereo on
setCD
setVolume 11

怎么样,一条命令执行了多个操作,很方便吧。

总结

本文要点:
极简命令模式
命令模式如何实现调用者和接收者的解耦
命令模式的撤销
命令模式的批处理命令

Head First设计模式读书笔记五 第六章 命令模式(单例略过)相关推荐

  1. Head First设计模式读书笔记十 第十一章 代理模式

    之前的总结链接 https://blog.csdn.net/u011109881/article/details/59191308 代理模式本身的框架结构并不难理解,但是在实际应用中,我们往往被实际应 ...

  2. 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago)

    强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago) 16.1 TD-Gammon 16.2 Samuel's Checkers Pla ...

  3. 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago)

    强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago) 16.6 Mastering the Game of Go 16.6.1 AlphaG ...

  4. 设计模式学习笔记(十七)——Command命令模式

    设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...

  5. 《网络空间内生安全》读书笔记:第六章 内生安全与可靠性技术

    第六章 内生安全与可靠性技术 网络空间最大的安全威胁是**基于目标对象内生安全问题的不确定攻击* 网络空间最大的防御难题是在缺乏先验知识条件下能否可靠应对基于未知的未知因素的不确定攻击 最大的理论挑战 ...

  6. 【Effective Objective-C 2.0读书笔记】第六章:块(Blocks)和大中枢派发(GCD)

    继续这本书的读书笔记,希望在其中也加入自己的一些总结,以加深理解.之前这一章写了很多了,保存到草稿箱中,不知道为何丢失了,真是可惜,看来CSDN的MarkDown编辑器还存在一些bugs,在它打上补丁 ...

  7. 马丁福勒《UML精粹》读书笔记_第六章

    第六章 对象图 什么是对象图? 对象图是在一个时间点上系统中各个对象的一个快照. 对象图也可被看做是不带消息的通信图(这点并不好理解,等"通信图"一章再说). 对象图和类图的区别? ...

  8. 《谈判力》读书笔记:第六章 如果对方实力强大怎么办?(确定你的最佳替代方案)

    第三部分 原则谈判法中常见的问题 第六章 如果对方实力强大怎么办?(确定你的最佳替代方案) 6.1保护自己 你赶飞机时,目的似乎变得极为重要. 但回头想想,自己完全可以乘下一班飞机.谈判往往让你面临相 ...

  9. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位"寸": 分辨率:手机屏幕像素点个数,例如720x1280分辨率: PPI(Pixels ...

最新文章

  1. TCP和UDP的区别(转)
  2. 重磅,Kubernetes 决定弃用 Docker!
  3. 【白皮书下载】《追本数源•开启产品智能化时代》| 产品指数级增长手册
  4. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类
  5. 每日程序C语言29-将数组逆序输出
  6. 【ArcGIS Pro微课1000例】0012:ArcGIS Pro属性表中文乱码完美解决办法汇总
  7. 深入理解 JVM Class文件格式(二)
  8. MySQL format()函数
  9. Windows下安装并使用MySQL数据库
  10. Android - 基于Toolbar的Navigation Drawer(Material Design)
  11. 复习----使用链表实现栈(后进先出)及迭代
  12. 【CC2530入门教程-01】CC2530微控制器开发入门基础
  13. 数据库实现中文汉字排序终极指南
  14. FlashBuild4序列号生成与使用方法
  15. ESP8266连接网络,获取网络天气api
  16. error: C1083: 无法打开包括文件: “QString”: No such error: ‘QDir‘ file not found
  17. Android Native层
  18. iOS逆向工程——获取app素材图片
  19. APICloud App开发上手经验分享之模块调用
  20. 无线局域网WLAN之初步认识

热门文章

  1. 1067 mysql,mysql免安装版1067错误终极解决办法图文教程
  2. 为什么颜值越来越重要_水质采样器为什么越来越重要
  3. matlab实验4图形的绘制,MATLAB编程与应用实验报告(三维图形绘制)
  4. (22)进程和线程区别
  5. JFreeChart的简单应用及乱码解决
  6. html笔记——网页中视频播放,文字滚动
  7. linux bash 获取 国内常见网站的IP列表
  8. winform下自绘提示框风格窗体
  9. html5作品展示的动效,html5动效系列八:8个非常神奇的HTML5动画和应用
  10. 30号晚直播丨数据操作加速器,CloudQuery v1.3.5 发布!