定义:

将一个请求封装成对象,使得请求发送者和请求接受者之间相互隔离,消除两者之间的耦合。引入命令类,使得不同请求对客户参数化,并且可以对命令添加附件操作,如:排队、撤销、日志、组合等。

结构图:

  • Command:抽象命令类,一般是一个抽象类或者接口。在其中定义了命令的执行execute()、undo()等操作。
  • ConcreteCommand:具体命令类,实现了抽象命令类的方法,并且持有命令接受者的引用。具体执行方法时,调用接受者的相关操作。
  • Invoker:请求发送者,通过命令对象执行请求。针对抽象命令类编程,并不需要关心对应的命令如何执行,被谁执行。与抽象命令的关联关系也不固定,可以通过注入或者构造的方法或者采用XML和反射的方法来进行关联。
  • Reciver:请求接受者,执行请求的相关操作,对请求进行详细的业务处理。

命令队列

当一个请求需要将需要多个接受者进行处理的时候,可以将多个命令放入队列中,每个命令对应一个接受者。请求发送者执行请求时,将遍历请求队列,对每个命令执行操作。

class CommandQueue {
//定义一个ArrayList来存储命令队列
private ArrayList<Command> commands = new ArrayList<Command>(); public void addCommand(Command command) {
commands.add(command);
} public void removeCommand(Command command) {
commands.remove(command);
} //循环调用每一个命令对象的execute()方法
public void execute() {
for (Object command : commands) {
((Command)command).execute();
}
}
}
class Invoker {
private CommandQueue commandQueue; //维持一个CommandQueue对象的引用 //构造注入
public Invoker(CommandQueue commandQueue) {
this. commandQueue = commandQueue;
} //设值注入
public void setCommandQueue(CommandQueue commandQueue) {
this.commandQueue = commandQueue;
} //调用CommandQueue类的execute()方法
public void call() {
commandQueue.execute();
}
}

命令的撤销

在抽象命令中不仅定义excute()接口,也定义undo()接口。所有具体执行的命令需要实现undo操作,可以结合备忘录模式来记录历史状态,完成该撤销操作。

//抽象命令类
abstract class AbstractCommand {
public abstract int execute(); //声明命令执行方法execute()
public abstract int undo(); //声明撤销方法undo()
}

宏命令

宏命令又称作组合命令,可以看做命令模式与组合模式的联合。对于宏命令可以拥有一个命令集合,当具体执行的时候需要遍历集合中的所有命令来递归地执行操作。

优点:

  • 将请求发送者和接受者之间完全解耦,使两者都具有很好的独立性。相同的请求者可以对应不同的接受者,而相同的接受者可以供不同请求者使用。
  • 可以很方便地添加新的命令,无需修改源码,可以通过配置文件制定。
  • 可以对命令添加很对其它的附加操作,例如:队列、日志、宏命令等,更好地符合业务需求。

实例:

CommandPattern

最新文章

  1. Atitit onvif协议获取rtsp地址播放java语言 attilx总结
  2. ASP.NET MVC 在WebService中Token的使用方法
  3. 【BZOJ】2178: 圆的面积并
  4. java.util.regex.PatternSyntaxException: Unclosed character class near index解决办法
  5. win10+vs2013+Qt5.4 安装方法
  6. [转] linux下的c/c++调试器gdb
  7. 电子设计省赛--DMA与ADC
  8. STM32开发指南-蜂鸣器实验
  9. SQL 数据库基本知识
  10. Java线程池使用和分析(二) - execute()原理
  11. jQuery EasyUI弹出确认对话框(确认操作中.....)
  12. 用keras作CNN卷积网络书本分类(书本、非书本)
  13. HashMap原理总结
  14. Xcode 下删除Provisioning Profiles文件
  15. Java的SSH框架整合
  16. Python SQLalchemy的学习与使用
  17. VMware 虚拟机运行卡慢的解决办法
  18. XVII Open Cup named after E.V. Pankratiev. GP of Siberia, Division 1
  19. MY服务器架设
  20. Linux - 执行命令与脚本

热门文章

  1. Atitit &#160;数据库的事件机制--触发器与定时任务attilax总结
  2. 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)
  3. 【笔记】js获取当前点击元素的索引
  4. Leetcode-24 Swap Nodes in Pairs
  5. VS中行号对齐的辅助线(虚线)去除
  6. python进程池:multiprocessing.pool
  7. Android自用-----WindowManager$BadTokenException: Unable to add window -- token null is not for an application
  8. 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算
  9. 解决Select2控件不能在jQuery UI Dialog中不能搜索的bug
  10. Stop sucking,Become awesome.这一年我做到了么