为什么80%的码农都做不了架构师?>>>   

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

四种角色:

Command:定义命令的统一接口

ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直接用来充当Receiver。

Receiver:命令的实际执行者

Invoker:命令的请求者,是命令模式中最重要的角色。这个角色用来对各个命令进行控制。

一个命令对象通过在特定接收者上绑定一组动作来封装一个请求。命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他队形不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。

举个栗子:

要实现一个智能开关的遥控器,可以控制客厅和卧室的灯、电视的开关等功能。

定义命令接口:

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();}
}// 关灯命令
public class LightOffCommand implements Command {Light light;public LightOffCommand(Light light){this.light = light;}public void execute() {light.off();}
}

遥控器:

// 遥控器有七个开关,初始化都是无命令的
public class RemoteControl {Command[] onCommands;Command[] offCommands;// 初始化遥控器public RemoteControl() {onCommands = new Command[7];offCommands = new Command[7];Command noCommand = new NoCommand();for (int i = 0; i < 7; i++) {onCommands[i] = noCommand;offCommands[i] = noCommand;}}// 配置按钮对应的命令public void setCommand(int index, Command onCommand, Command offCommand) {onCommands[index] = onCommand;offCommands[index] = offCommand;}// 按下开按钮public void onButtonWasPushed(int index) {onCommands[index].execute();}// 按下关按钮public void offButtonWasPushed(int index) {onCommands[index].execute();}
}

测试遥控器:

public class RemoteTest {RemoteControl remoteControl = new RemoteControl();Light livingRoomLight = new Light("Living Room");Light kitchenLight = new Light("kitchen");// 设置遥控器按钮命令LightOnCommand livingRoomLightOnCommand = new LightOnCommand(livingRoomLight);LightOffCommand livingRoomLightOffCommand = new LightOffCommand(livingRoomLight);LightOnCommand kitchenLightOnCommand = new LightOnCommand(kitchenLight);LightOffCommand kitchenLightOffCommand = new LightOffCommand(kitchenLight);remoteControl.setCommand(0, livingRoomLightOnCommand, livingRoomLightOffCommand);remoteControl.setCommand(1, kitchenLightOnCommand, kitchenLightOffCommand);// 卧室灯开关操作remoteControl.onButtonWasPushed(0);remoteControl.offButtonWasPushed(0);// 厨房灯开关操作remoteControl.onButtonWasPushed(1);remoteControl.offButtonWasPushed(1);
}

转载于:https://my.oschina.net/suyain/blog/1924889

读《HeadFirst设计模式》笔记之命令模式相关推荐

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

    首先看看命令模式的定义:命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销的操作. 所谓参数化,我的理解是实际执行的对象,比如light(电灯).strer ...

  2. Head First 设计模式笔记 5.命令模式

    文章目录 设计要求 命令模式 实际实现 命令模式具体应用 设计要求 小明接到了新任务,要求设计一个遥控器,这个遥控器上面有七个插槽,每个插槽都有对应的开和关按钮.要求每个都能控制任意家电如灯,电视,电 ...

  3. 设计模式笔记(15)---命令模式(行为型)

    h3>Gof定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 动机 在软件构建过程中,"行为请求者"与 ...

  4. 经典伴读_GOF设计模式_结构型模式

    经典伴读系列文章,不是读书笔记,自己的理解加上实际项目中运用,旨在5天读懂这本书.如果这篇文章对您有些用处,请点赞告诉我O(∩_∩)O. 如何使用设计模式抽象实例化过程.请参考<经典伴读_GOF ...

  5. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  6. Head First 设计模式中的命令模式 的一个错误

    最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...

  7. 【转】设计模式学习笔记之命令模式

    定义:将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式支持可撤销等操作. 命令模式将发出请求的对象和执行请求的对象解耦.在被解耦的两者之间是通过命令对象进行沟通的. 案例代 ...

  8. 【源码分析设计模式 13】命令模式

    一.基本介绍 1.在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 ...

  9. 【学习笔记】命令模式与备忘录之简单计算器

    挺长时间没写博文了,发现如果要写一篇(个人感觉上的)比较完整的博文,还是需要花费挺长的时间的,前阵子忙着一些资料复习,没能动手写笔记心得与实验.虽然写文章挺耗费时间的, 但是所能得到的也很多,在写的过 ...

  10. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

最新文章

  1. TVM在ARM GPU上优化移动深度学习
  2. LINUX自旋锁详解2
  3. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
  4. MusicXML 3.0 (20) - 钢琴踏板
  5. 默写测试晋级流程 1126
  6. c语言怎么读取mhx文件内容,C语言重新学习――基础杂类
  7. qcow2磁盘格式分析
  8. ios 模拟器沙盒_iOS模拟器的路径-打开沙盒路径
  9. Centos+Mysql+sphinx+mmseg(rhel4)
  10. A simple Android example,including Intent/View/...
  11. doubango TURN Data Indication报文代码
  12. MySQL(12)-----多表查询(内连接和外连接)
  13. python的PIL库
  14. 自行搭建app分发平台
  15. 上对不起父母,下对不起孩子,你却自以为美好
  16. 【pytorch】torchvision.transforms 图像的变换详解;图像的预处理;数据增强
  17. linux c++ 守护 程序,supervisor守护进程 | C/C++程序员之家
  18. 多分区装linux系统,Linux安装之多系统分区
  19. mysql 添加/删除列(column)
  20. PycURL学习笔记

热门文章

  1. sun.net.ftp.FtpClient 匿名登录时提示密码不可为空。
  2. SpringBoot项目集成socketIo实现实时推送
  3. quick 3.3加载Spine问题,quick3.3加载spine
  4. SAPUI5教程——如何改变SAP Fiori登陆页面的背景图片
  5. java中return什么时候要加,什么时候不用加,return的作用是什么
  6. 大数据分析平台洱源县_洱源:引入“发财树”  群众奔富路
  7. Java经典编程习题100例:第18例:编写程序,将一个数组中的元素倒排过来。例如原数组为1,2,3,4,5;则倒排后数组中的值
  8. IDEA学生申请许可证,如果遇到无许可证的时候可申请链接邮箱
  9. JAVA基础面向对象
  10. 11个在线学习网站,学习编码和更多内容!