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. delphi.指针.PChar

    此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不 ...

  2. http请求提交cookie

    package leadsServerTest;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient ...

  3. Linux系统启动级别及顺序

    Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多 ...

  4. jq 版的tab切换

    ta切换是在前端中非常常见的一种效果,网上的效果很多.但是我觉得下面这种方法最好,把tab效果封装成一个函数 tabs,这个函数要配合jq使用. var tabs = function (tab, c ...

  5. 基于mini2440的uboot移植(一)

    一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...

  6. 《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程

    描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率 ...

  7. js 中文乱码解决方法

     bookManageAdd: function () {         top.MainFrameJS.confirm = true;         var action = getQueryS ...

  8. iOS平台使用陀螺仪传感器

    在移动端开发过程中,有时候会用到陀螺仪传感器获取当前手机的姿态,下面给出iOS端如何获取陀螺仪姿态数据的代码: //根据陀螺仪的四元数转换为矩阵 + (GLKMatrix4)calculateMatr ...

  9. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  10. sellsa

    我看见天空很蓝 就像你在我身边的温暖 生命有太多遗憾 人越成长越觉得孤单 我很想飞 多远都不会累 才明白爱得越深心就会越痛 我只想飞 在我的天空飞 我知道你会在我身边 回忆的画面 记录的语言 爱始终是 ...