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

设计原则:

  • 把方法的调用封装起来,调用此对象不需要知道它内部具体是如何运行的,只需要知道包装成型的方法
  • 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开
  • 将“动作请求者”从“动作执行者”中解耦,即将发出请求的对象和接受并执行请求的对象分离开来。两者通过命令对象沟通
  • 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联

特点:

  • 对象只知道通过接口暴露出execute()方法,当此方法调用时,接受者执行具体的动作。对象不知道那个接受者执行了什么动作,只知道操作进行了

NoCommand对象:execute()方法为空的对象,即不执行任何操作的对象。客户端处理null操作时交给空对象,而无需做if(command != null)操作。

撤销操作:在管理一组操作对象的对象中可以添加一个上一个操作的对象引用,用于追踪最后调用的命令,并通过命令的undo()方法实现撤销。同样在操作命令对象中也可添加局部变量记录上一个状态以实现undo()方法。

可使用堆栈记录操作过程中的每一个命令,实现多次撤销

宏命令:同时执行多个命令,软编码,传入命令数组,动态决定哪些命令

日志请求:使用命令模式的记录日志,我们可以将上个检查点之后的操作都记录下来,如果系统出现问题,从检查点开始执行命令

队列请求:把一组命令放到队列(先进先出)中,线程从队列中一个一个删除命令,然后调用它的excecute()方法。

类图:

Command:定义命令的接口,声明执行的方法。
ConcreteCommand:命令接口实现对象,通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。(组合方式)
Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。
Client:创建具体的命令对象,并且设置命令对象的接收者。真正使用命令的客户端是从Invoker来触发执行。

举例:

使用命令模式实现遥控器,遥控器上的不同按钮控制电灯的开关及亮度、天花板风扇的开关及转速等,支持撤销

1、命令接口:Command

1 public interface Command {
2     public void execute();
3 }

2、对Receiver(灯)实现开关命令

 1 public class LightOnCommand implements Command {
 2     Light light;
 3     public LightOnCommand(Light light) {
 4         this.light = light;
 5     }
 6     public void execute() {
 7         light.on();
 8     }
 9 }
10
11 public class LightOffCommand implements Command {
12     Light light;
13     public LightOffCommand(Light light) {
14         this.light = light;
15     }
16     public void execute() {
17         light.off();
18     }
19 }

3、实现Invoker控制

 1 public class SimpleRemoteControl {
 2     Command slot;
 3     public SimpleRemoteControl() {}
 4     public void setCommand(Command command) {
 5         slot = command;
 6     }
 7     public void buttonWasPressed() {
 8         slot.execute();
 9     }
10 }

4、Client使用Invoker控制器

1 public class RemoteControlTest {
2     public static void main(String[] args) {
3         SimpleRemoteControl remote = new SimpleRemoteControl();
4         Light light = new Light();
5         LightOnCommand lightOn = new LightOnCommand(light);
6         remote.setCommand(lightOn);
7         remote.buttonWasPressed();
8         }
9 }

转载于:https://www.cnblogs.com/HectorHou/p/5995049.html

命令模式——HeadFirst设计模式学习笔记相关推荐

  1. 责任链模式——HeadFirst设计模式学习笔记

    责任链模式:使一个以上的对象都有机会能够处理某个请求 特点: 链中的每个对象包含它下一个对象的引用和对事件的处理方法.请求在这个链上传递,直到链上的某一个对象决定处理此请求 发出这个请求的客户端并不知 ...

  2. 原型模式——HeadFirst设计模式学习笔记

    原型模式:通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的(clone) 特点: 向用户隐藏了创建新实例的复杂性 让用户可以产生未知类型的对 ...

  3. 代理模式——HeadFirst设计模式学习笔记

    代理模式:为另一个对象提供一个替身或占位符控制这个对象的访问 特点: 让代理对象控制对象的访问,被代理对象可以是远程对象(远程代理),创建开销较大对象(虚拟代理),或需要安全控制的对象(保护代理) 为 ...

  4. 【HeadFirst 设计模式学习笔记】6 命令模式

    1.这一节我们的任务是创建一个类似智能家居的万能遥控器,控制各种家电.我们需要将"请求"封装成对象(一个命令对象通过在特定接收者上绑定一组动作来封装请求),以便使用不同的请求.队列 ...

  5. 策略模式(headfirst设计模式学习笔记)

    鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变.假设须要能够执行时改变行为! 策略模式定义了算法族.分别封装起来.让他们能够相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继 ...

  6. 【HeadFirst 设计模式学习笔记】9 迭代器模式

    1.本节的一个话题引子是一个餐厅,它提供早餐和午餐,但是在订制菜单的时候,早餐(Pancake)和午餐(Dinner)的实现却造成了一些麻烦.订制早餐的菜单是用ArrayList这样一个数据池来维护的 ...

  7. 【HeadFirst 设计模式学习笔记】13 MVC分析

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.M-V-C --Model--View--Controller,模式-视图-控制器,这是一种范型.模型对象正 ...

  8. 【HeadFirst 设计模式学习笔记】2 观察者模式

    1.我们需要理解报社.订阅系统和订报人之间的关系,订报人通过订阅系统订报,一旦报社有新的报纸,订阅系统就会派人送或者邮寄给订报人新的报纸.然后,出版者+订阅者就是观察者模式,只不过名称不一样,主题(S ...

  9. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

最新文章

  1. master-slave(主/从)模式
  2. pygame学习和python巩固——字体显示
  3. 八十四、Python | Leetcode回溯算法系列
  4. 多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程
  5. Windows中命令提示符被禁用的解决方法
  6. Video-Swin-Transformer (二)
  7. quartz集群重复调度的解决
  8. 剑指offer——3.实现数组中重复数字查找
  9. [数据仓库]大数据体系下的工作者分类
  10. 安徽大学计算机科学与技术学院刘峰,刘峰
  11. Windows 之间用rsync同步数据(cwRsyncServer配置)
  12. 传智播客 机器学习基础 学习笔记
  13. BZOJ 1001 平面图转对偶图
  14. 每日单词20110501
  15. 谈谈我了解的那些在线it学习网站
  16. 3分钟带你了解微信小程序开发
  17. Niagara程序入门
  18. MYSQL 唯一约束
  19. 什么是MySQL| 什么是数据库 | 数据库详解
  20. 在路径没问题的情况下,组件报错Component is not found

热门文章

  1. 又肝了下微服务 API 网关“金刚”,也是蛮香的~
  2. 那些年,我们踩过的 Java 坑
  3. 你在京东购买的商品,是怎么出现在抖音里面的?
  4. Kubernetes大集群怎么管?基于监控的弹性伸缩方法
  5. 【Python】青少年蓝桥杯_每日一题_11.11_统计英文字母、空格、数字、其他字符的个数
  6. Android --- This project contains Java compilation errors,which can cause rendering failures for
  7. element ui 下拉列表验证无效的问题(通俗易懂)-实例讲解
  8. rust比java慢,rust为什么跑得比js慢
  9. 详细说明通过kettke对csv文件转换的操作步骤_如何将多页面pdf分割成一页一页的PDF文件...
  10. java 爬中 验证码识别_JAVA爬虫---验证码识别技术(一)