1 意图:将一个请求封装为一个对象,可以用不同的请求对客户进行参数化;

对请求排队或记录请求日志,以及支持可撤销的操作。

2 别名:Action、Transaction

3 动机:把请求变成一个对象。关键是定义一个抽象的Command类,定义一个执行操作的接口。最简单有一个抽象的Execute操作。

具体的Command子类将接收者作为一个实例变量,实现Execute,指定接收者采取的动作。

有时需要执行一系列的命令,定义一个MacroCommand来执行任意数目的命令。序列中的命令各自定义接收者。

注意:Command怎样解耦“调用操作的对象”和“具有执行该操作所需要信息的那个对象”。

动态替换Command对象

4 适用性:

.抽象出待执行的动作用来参数化某对象。可以用Callback实现。

回调函数是指,先在某处注册,在稍后某个需要的时候被调用。

Command模式是回调函数的一个面向对象的替代品。

.在不同时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。

如果一个请求的接收者可用一种与地址空间无关的方式表达, 那么可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。

.支持取消操作,Execute前,保存执行前的操作状态,这些修改可以被重做一遍。Command添加UnExecute操作

.支持修改日志,当系统崩溃时,修改可被重做一遍。需要添加装载操作和存储操作

.用构建在原语操作上的高层操作构造一个系统。支持事务。

5 参与者:

Command:声明执行操作的接口

ConcreteCommand:将一个接收者对象绑定于一个动作。调用接收者相应的操作实现Execute

 Client:创建一个具体命令对象并设定它的接收者。

Invoker:要求该命令执行这个请求。

Receiver:知道如何实施与执行一个请求相关的操作。任何类都肯恩作为一个接收者。

6 协作:

.客户创建一个ConcreteCommand并制定它的Receiver对象

.Invoker对象存储该ConcreteCommand对象

.Invoker通过调用Command对象的Execute操作提交一个请求。

命令是可撤销的,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消命令

.ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求

7 效果:

.将调用对象的操作与知道如何实现该操作的对象解耦

.Command是头等的对象。可以扩展

.将多个命令装配成一个符合命令。MacroCommand。一般,复合命令是Composite的一个实例

.增加新的Command很容易

8 实现:

1)一个命令对象应达到何种智能程度

一个极端:仅确定该请求的接收者和执行该请求的操作

另一个极端:自己实现所有功能,不要额外的接收者对象

2)支持取消和重做操作

ComcreteCommand需要额外存储状态信息。

这个状态包括:

.接收者对象,真正执行处理该请求的各操作

.接收者上执行该操作的参数

.如果接收者的某些值被改变了,需要先保存起来。

要支持多级取消重做,需要历史列表。Command对象在各次调用之间的状态如果变化,需要拷贝命令对象,以区分相同命令的不同调用。

如果状态不变就不需要拷贝,这些必须背靠背的Command对象起着原型的作用

3)避免取消操作过程中的错误累积

Memento模式使得Command访问这些信息不暴露其他对象的内部状态

4)使用C++模板

对不能被取消,不需要参数的命令。避免为每一种动作和接收者都创建一个Command子类

9 相关命令:

.Composite模式可被用来实现宏命令

.Memento模式保持某个状态

还有Prototype

Command设计模式的更多相关文章

  1. Java 设计模式之 Command 设计模式

    首先我们先来看 UML 图: 参考资料: java设计模式-Command(命令)模式 - - ITeye技术网站http://men4661273.iteye.com/blog/1633775 JA ...

  2. 详解command设计模式,解耦操作和回滚

    大家好,欢迎来到设计模式专题,我们的主旨是介绍一些有趣好玩的设计模式. 今天我们介绍的设计模式叫做命令模式(command),在这个模式下,我们可以实现do和undo的解耦,让使用方不用关心内部的实现 ...

  3. 《C++设计新思维》Command设计模式读后感

    原文内容提领: 本书第5章标题为泛化仿函数,我认为本章真正讲述的内容可以总结出一句话! 如何利用C++老标准实现C++11新标准类似std::function提供的功能. std::function简 ...

  4. [学习笔记]设计模式之Command

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 在上篇Chain of Responsibility(职责链)模式笔记中,我们学习了一种行为型设计模式.今天,我们继续这一主题,来学习 ...

  5. Command模式(命令设计模式)

    Command?? 把方法的调用用一个类的实例来承载,要管理工作的历史记录,创建这些方法执行的命令的集合,只需管理这些实例的集合即可,而且还可以随时再次执行过去的命令,或是将多个过去的命令整合为一个新 ...

  6. Swift语言之命令模式(Command Pattern)实现

    今天遇到这样一个问题,我现在有一个整数数组,如: var numbers = [3, 7, 12, 9, 200] 现需要对其中的每一个数字都执行一系列相同的加减乘除操作,如对每一个数字都加5乘8再减 ...

  7. (Command Pattern)命令模式

    定义 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 结构图: 命令模式的角色划分: Reciever(命令的接收者):接收命令,并知道如何进行必 ...

  8. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  9. VTK的学习资源

    本文介绍从哪儿开始学习VTK(Visualization Toolkit的简称),如何在网上找寻VTK的学习资源. 首先,可以到维基百科或者百度百科上查看VTK条目,了解VTK是什么. http:// ...

随机推荐

  1. CentOS6.5下MAC

    CentOS6.3安装Mac桌面主题 (2013-03-28 14:31:42) 转载▼     首先下载Mac4Lin_Install_v1.0.zip             我给出个下载地址ht ...

  2. 【LTE基础知识】SGLTE, SVLTE, CSFB, VoLTE

    4G网络下实现语音通话功能的技术共有三种--VoLTE.SGLTE(GSM /LTE同步并发)和CSFB(电路域回落).简单来说: VoLTE就是语音数据都在4G通道内完成: SGLTE是语音走2G通 ...

  3. 中型企业的IT运维策略

    如何建设一支能够解决问题.创造价值.有活力的.不断进取的IT运维团队,并带领这支团队?充分发挥这个团队的优势力量,是运维业务有效开展的关 键.运维策略是直接体现运维业务的经济价值所在.好的运维措施.方 ...

  4. MySql中使用日期函数获取昨天的数据

    .body-classic{ color:#444; font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Rom ...

  5. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

  6. Myeclipse 10.7 android(安卓) 开发环境搭建

    1 下载并安装JDK,并且设置环境变量 2 下载安装 installer_r24.3.4-windows.exe (Android SDK Manager) 3 使用 Android SDK Mana ...

  7. @RequestMapping测试各种访问方式

    这里访问WEB-INF目录下的页面,这个还不知道有没有类似struts2那样的通配符来可以访问不同的action,不同的method,不同 的页面,用户则很爽,有的话求告知,而且我还有一个问题就是配置 ...

  8. 06_在web项目中集成Spring

    在web项目中集成Spring 一.使用Servlet进行集成测试 1.直接在Servlet 加载Spring 配置文件 ApplicationContext applicationContext = ...

  9. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  10. Codeforces Round #379 (Div. 2) E. Anton and Tree 树的直径

    E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...