Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到
具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现
者之间的解耦。

在GOF的《设计模式:可复用面向对象软件的基础》一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。

UML类图


Command:声明执行操作的接口;
ConcreteCommand:将一个接收者对象绑定于一个动作,之后,调用接收者相应的操作,以实现Execute来完成相应的命令;
Client:创建一个具体命令对象,但是并没有设定它的接收者;
Invoker:要求该命令执行这个请求;
Receiver:知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。

以上这些对象是按照下面的方式进行协作的:

    1. Client创建一个ConcreteCommand命令对象,并指定它的Receiver对象;
    2. Invoker对象存储该ConcreteCommand对象;
    3. 该Invoker通过调用Command对象的Execute操作来提交一个请求。如果这个命令请求是可以撤销的,ConcreteCommand就执行Execute操作之前存储当前状态以用于取消该命令请求;
    4. ConcreteCommand对象调用Receiver的一些操作以执行该请求。
#include <iostream>
using namespace std; #define SAFE_DELETE(p) if (p) { delete p; p = NULL; } class Receiver
{
public:
void Action()
{
cout<<"Receiver->Action"<<endl;
}
}; class Command
{
public:
virtual void Execute() = ;
}; class ConcreteCommand : public Command
{
public:
ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){}
void Execute()
{
m_pReceiver->Action();
}
private:
Receiver *m_pReceiver;
}; class Invoker
{
public:
Invoker(Command *pCommand) : m_pCommand(pCommand){}
void Invoke()
{
m_pCommand->Execute();
}
private:
Command *m_pCommand;
}; int main()
{
Receiver *pReceiver = new Receiver();
Command *pCommand = new ConcreteCommand(pReceiver);
Invoker *pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
SAFE_DELETE(pInvoker);
SAFE_DELETE(pCommand);
SAFE_DELETE(pReceiver);
return ;
}

最新文章

  1. How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS? [ID 558514.1]
  2. mysql多种备份方式比较及实现
  3. .Net Core+cenos7+Docker+Dockerfile 部署实践
  4. Excel计算一列的和sum(A:A)
  5. MSP430之ADC采集滤波
  6. easyui datagrid 多表头设置
  7. ExecutorService.execute(Runnable x) 判断是否完成,得到返回值
  8. 关于Comparator和Comparable
  9. linux之let用法
  10. UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)
  11. Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序
  12. Vb.net MakeLong MAKELPARAM 合并整数代码
  13. 初步了解Bootstrap4
  14. LAB8 android
  15. Kubernetes1.91(K8s)安装部署过程(二)--证书kubeconfig文件创建
  16. Linux awk工具简单学习记录
  17. SpringMVC系列(八)国际化
  18. 数据库主键ID生成策略
  19. jenkins+jacoco+ant自动化代码和应用服务代码分离场景获取远程服务的覆盖率
  20. Java9 modules (Jigsaw)模块化迁移

热门文章

  1. python简单爬虫编写
  2. XMLHTTPRequest的属性和方法简介
  3. 记录一下hdu的几道题
  4. 不用Unity库,自己实现.NET轻量级依赖注入
  5. 浅析 GRUB 如何加载 linux kernel
  6. windbg调试.net程序
  7. 一个PHP加密脚本,达到一定免杀效果
  8. uploadify 上传
  9. jquery 在ie10中post数据,最终数据丢失的BUG修复
  10. 每日一“酷”之textwrap