1.意图

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

2.别名

动作(Action),事务(Transaction)

3.动机

命令模式通过将请求本身变成一个对象来使请求可向未指定的应用对象提出请求。这个对象可被存储并像其他的对象一样被传递。

4.适用性

  • 抽象出待执行的动作以参数化某对象。
  • 在不同的时刻指定、排列和执行请求
  • 支持取消操作。
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍
  • 用构建在原语操作上的高层操作构造一个系统。

5.结构

6.代码实例

//Command.h

#include <memory>

class AbstractReceiver;

class AbstractCommand
{
public:
virtual void Execute() = ;
virtual void SetReceiver(std::shared_ptr<AbstractReceiver> receiver );
protected: std::shared_ptr<AbstractReceiver> m_Receiver;
}; class ConcreteCommand1 : public AbstractCommand
{
public:
void Execute();
}; class ConcreteCommand2 : public AbstractCommand
{
public:
void Execute();
};
//Receiver.h

class AbstractReceiver
{
public:
virtual void Action() = ;
}; class ConcreteReceiver1 : public AbstractReceiver
{
public:
void Action(); }; class ConcreteReceiver2 : public AbstractReceiver
{
public:
void Action(); };
//Command.cpp

#include <iostream>
#include "Receiver.h"
#include "Command.h" void AbstractCommand::SetReceiver(std::shared_ptr<AbstractReceiver> receiver)
{
m_Receiver = receiver;
} void ConcreteCommand1::Execute()
{
m_Receiver->Action();
}; void ConcreteCommand2::Execute()
{
m_Receiver->Action();
};
//Receiver.cpp

#include <iostream>
#include "Receiver.h" void ConcreteReceiver1::Action()
{ std::cout << "Receiver1 Action Executed" << std::endl;
}; void ConcreteReceiver2::Action()
{ std::cout << "Receiver2 Action Executed" << std::endl; };
//Client.cpp

#include "Command.h"
#include "Receiver.h" int main()
{
std::shared_ptr<AbstractCommand> pConcreteCommand1(new ConcreteCommand1); std::shared_ptr<AbstractCommand> pConcreteCommand2(new ConcreteCommand2); std::shared_ptr<AbstractReceiver> pReceiver1(new ConcreteReceiver1); std::shared_ptr<AbstractReceiver> pReceiver2(new ConcreteReceiver2); pConcreteCommand1->SetReceiver(pReceiver1); pConcreteCommand2->SetReceiver(pReceiver2); pConcreteCommand1->Execute(); pConcreteCommand2->Execute(); while(); }

7.测试结果

8.效果

  • 将调用操作的对象与知道如何实现该操作的对象解耦。
  • Command对象是头等的对象。它可以像其它对象一样被操作和扩展。
  • 可以将多个命令装配成一个命令。
  • 增加新的Command很容易,因为无需改变已有的类。

Command(命令)-对象行为型模式的更多相关文章

  1. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  2. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  3. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  4. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  5. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  6. 对象创建型模式------Builder(生成器)

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

  7. 迭代器模式/iterator模式/对象行为型模式

    意图 又名:游标(Cursor): 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 动机 一个聚合对象,提供访问元素的方法,而有不暴露它的内部结构.如list,将对列表的访问 ...

  8. Mediator(中介者)-对象行为型模式

    1.意图 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 2.动机 通过将集体行为封装在一个单独的中介者对象中,中介者 ...

  9. Iterator(迭代器)-对象行为型模式

    1.意图 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 2.别名 Cursor-游标. 3.动机 一个聚合对象,应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的 ...

随机推荐

  1. 从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败问题解决方法

    从ICassFactory为CLSID为{17BCA6E8-A950-497E-B2F9-AF6AA475916F}的COM组件创建实例失败,原因是出现以下错误:c001f011.(Microsoft ...

  2. Xenko基础API笔记3- Pointers指针设备屏幕上点对应的手指触摸。

    样本这里是一个简单的示例程序,跟踪目前在屏幕上的指针和打印他们的位置.访问输入字段,类继承自@ SiliconStudio.Xenko.脚本的类. public override async Task ...

  3. python基础之迭代与解析

    先简单看一下文件迭代器 >>> f=open('file1') >>> f.readline() "'aaa','bbb','ccc'\n" & ...

  4. 使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不可达"

    使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不 ...

  5. 如何知道使用的是哪种shell?

    命令一:[echo $0] 命令二:[echo $$]

  6. ORCLE基本语句(二)

    select语句的基本语法: [ORDER BY < COLUMN1, COLUMN2, COLUMN3...> [ASC 或 DESC]]

  7. Docker学习过程中遇到的问题及解决方法

    1.重新安装Docker后,运行不起来 [root@zyt-test-14-53 ~]# docker infoCannot connect to the Docker daemon. Is the ...

  8. Web APi之安装配置实现Cors跨域

    参考:http://www.cnblogs.com/CreateMyself/p/4836628.html 1.通过NuGet下载程序包,搜索程序包[Microsoft.AspNet.WebApi.C ...

  9. React知识点总结1

    最近打算把react知识点总结下: React特点 1.虚拟DOM 在内存中操作DOM,在内存中创建数据结构,只会更新有差异的地方 2.组件化 页面分成若干个组件,每个组件包含逻辑结构和样式 组件仅包 ...

  10. MongoDB是一个介于关系数据库和非关系数据库之间的产品

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.M ...