命令模式——HeadFirst设计模式学习笔记
命令模式:将“请求”封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
设计原则:
- 把方法的调用封装起来,调用此对象不需要知道它内部具体是如何运行的,只需要知道包装成型的方法
- 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开
- 将“动作请求者”从“动作执行者”中解耦,即将发出请求的对象和接受并执行请求的对象分离开来。两者通过命令对象沟通
- 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联
特点:
- 对象只知道通过接口暴露出execute()方法,当此方法调用时,接受者执行具体的动作。对象不知道那个接受者执行了什么动作,只知道操作进行了
NoCommand对象:execute()方法为空的对象,即不执行任何操作的对象。客户端处理null操作时交给空对象,而无需做if(command != null)操作。
撤销操作:在管理一组操作对象的对象中可以添加一个上一个操作的对象引用,用于追踪最后调用的命令,并通过命令的undo()方法实现撤销。同样在操作命令对象中也可添加局部变量记录上一个状态以实现undo()方法。
可使用堆栈记录操作过程中的每一个命令,实现多次撤销
宏命令:同时执行多个命令,软编码,传入命令数组,动态决定哪些命令
日志请求:使用命令模式的记录日志,我们可以将上个检查点之后的操作都记录下来,如果系统出现问题,从检查点开始执行命令
队列请求:把一组命令放到队列(先进先出)中,线程从队列中一个一个删除命令,然后调用它的excecute()方法。
类图:
举例:
使用命令模式实现遥控器,遥控器上的不同按钮控制电灯的开关及亮度、天花板风扇的开关及转速等,支持撤销
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设计模式学习笔记相关推荐
- 责任链模式——HeadFirst设计模式学习笔记
责任链模式:使一个以上的对象都有机会能够处理某个请求 特点: 链中的每个对象包含它下一个对象的引用和对事件的处理方法.请求在这个链上传递,直到链上的某一个对象决定处理此请求 发出这个请求的客户端并不知 ...
- 原型模式——HeadFirst设计模式学习笔记
原型模式:通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的(clone) 特点: 向用户隐藏了创建新实例的复杂性 让用户可以产生未知类型的对 ...
- 代理模式——HeadFirst设计模式学习笔记
代理模式:为另一个对象提供一个替身或占位符控制这个对象的访问 特点: 让代理对象控制对象的访问,被代理对象可以是远程对象(远程代理),创建开销较大对象(虚拟代理),或需要安全控制的对象(保护代理) 为 ...
- 【HeadFirst 设计模式学习笔记】6 命令模式
1.这一节我们的任务是创建一个类似智能家居的万能遥控器,控制各种家电.我们需要将"请求"封装成对象(一个命令对象通过在特定接收者上绑定一组动作来封装请求),以便使用不同的请求.队列 ...
- 策略模式(headfirst设计模式学习笔记)
鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变.假设须要能够执行时改变行为! 策略模式定义了算法族.分别封装起来.让他们能够相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继 ...
- 【HeadFirst 设计模式学习笔记】9 迭代器模式
1.本节的一个话题引子是一个餐厅,它提供早餐和午餐,但是在订制菜单的时候,早餐(Pancake)和午餐(Dinner)的实现却造成了一些麻烦.订制早餐的菜单是用ArrayList这样一个数据池来维护的 ...
- 【HeadFirst 设计模式学习笔记】13 MVC分析
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.M-V-C --Model--View--Controller,模式-视图-控制器,这是一种范型.模型对象正 ...
- 【HeadFirst 设计模式学习笔记】2 观察者模式
1.我们需要理解报社.订阅系统和订报人之间的关系,订报人通过订阅系统订报,一旦报社有新的报纸,订阅系统就会派人送或者邮寄给订报人新的报纸.然后,出版者+订阅者就是观察者模式,只不过名称不一样,主题(S ...
- 设计模式学习笔记——命令(Command)模式
设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...
最新文章
- master-slave(主/从)模式
- pygame学习和python巩固——字体显示
- 八十四、Python | Leetcode回溯算法系列
- 多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程
- Windows中命令提示符被禁用的解决方法
- Video-Swin-Transformer (二)
- quartz集群重复调度的解决
- 剑指offer——3.实现数组中重复数字查找
- [数据仓库]大数据体系下的工作者分类
- 安徽大学计算机科学与技术学院刘峰,刘峰
- Windows 之间用rsync同步数据(cwRsyncServer配置)
- 传智播客 机器学习基础 学习笔记
- BZOJ 1001 平面图转对偶图
- 每日单词20110501
- 谈谈我了解的那些在线it学习网站
- 3分钟带你了解微信小程序开发
- Niagara程序入门
- MYSQL 唯一约束
- 什么是MySQL| 什么是数据库 | 数据库详解
- 在路径没问题的情况下,组件报错Component is not found
热门文章
- 又肝了下微服务 API 网关“金刚”,也是蛮香的~
- 那些年,我们踩过的 Java 坑
- 你在京东购买的商品,是怎么出现在抖音里面的?
- Kubernetes大集群怎么管?基于监控的弹性伸缩方法
- 【Python】青少年蓝桥杯_每日一题_11.11_统计英文字母、空格、数字、其他字符的个数
- Android --- This project contains Java compilation errors,which can cause rendering failures for
- element ui 下拉列表验证无效的问题(通俗易懂)-实例讲解
- rust比java慢,rust为什么跑得比js慢
- 详细说明通过kettke对csv文件转换的操作步骤_如何将多页面pdf分割成一页一页的PDF文件...
- java 爬中 验证码识别_JAVA爬虫---验证码识别技术(一)