在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。

但在某些场合,比方要对行为进行“记录、撤销/重做、事务”等处理。这样的无法抵御变化的紧耦合是不合适的。在这样的情况下。怎样将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象。实现二者之间的松耦合。这就是命令模式(Command Pattern)。

在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想。当将客户的单个请求封装成对象以后,我们就行对这个请求存储很多其它的信息。使请求拥有很多其它的能力;命令模式相同可以把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。

Command:
定义命令的接口,声明运行的方法。

ConcreteCommand:
命令接口实现对象。是“虚”的实现;一般会持有接收者,并调用接收者的功能来完毕命令要运行的操作。

Receiver:
接收者,真正运行命令的对象。不论什么类都可能成为一个接收者。仅仅要它可以实现命令要求实现的对应功能。
Invoker:
要求命令对象运行请求。一般会持有命令对象,能够持有非常多的命令对象。这个是client真正触发命令并要求命令运行对应操作的地方。也就是说相当于使用命令对象的入口。
Client:
创建详细的命令对象,而且设置命令对象的接收者。注意这个不是我们常规意义上的client。而是在组装命令对象和接收者,也许。把这个Client称为装配者会更好理解,由于真正使用命令的client是从Invoker来触发运行。

1.命令模式的本质是对命令进行封装。将发出命令的责任和运行命令的责任切割开。
2.每个命令都是一个操作:请求的一方发出请求,要求运行一个操作;接收的一方收到请求。并运行操作。
3.命令模式同意请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口。更不必知道请求是怎么被接收,以及操作是否被运行、何时被运行,以及是怎么被运行的。

4.命令模式使请求本身成为一个对象。这个对象和其它对象一样能够被存储和传递。
5.命令模式的关键在于引入了抽象命令接口。且发送者针对抽象命令接口编程,仅仅有实现了抽象命令接口的详细命令才干与接收者相关联。

class Receiver
{
public:void Action(){cout<<"Receiver->Action"<<endl;}
};class Command
{
public:virtual void Execute() = 0;
};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 0;
}

[C++设计模式] command 命令模式相关推荐

  1. C++设计模式-Command命令模式

    Command命令模式 作用:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 由于"行为请求者"与"行 ...

  2. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 设计模式学习笔记(十七)——Command命令模式

    设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. 设计模式 之 命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...

  6. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  7. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  8. 设计模式:命令模式(Command)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. java execute 执行成功_【JAVA】设计模式之命令模式(Command模式)的使用分析

    命令模式属于23种设计模式中行为模式中的一个,它也是一种简单实用非常普遍的设计模式. 首先看下GOF对命令模式的定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录 ...

最新文章

  1. 【响应式Web前端设计】设置图片间隙为0
  2. hdfs数据均衡操作命令
  3. istringstream字符串流,实现类似字符串截取的功能,字符串流中的put,str()将流转换成为字符串string
  4. sublime text2如何连接FTP/SFTP——图文详细教程
  5. ajax error的用法,JQuery ajaxError()用法及代码示例
  6. abp执行mysql语句_在ABP模板工程中使用MySql
  7. 批量生成变量及引用_R语言:data.table语句批量生成变量
  8. 【从零开始自制CPU之学习篇00】开篇
  9. windows libwebsocket
  10. 2、linux系统root用户忘记密码后的重置方式
  11. 课后答案︻︼─一大收集
  12. 代码比较工具DiffMerge的下载和使用(转)
  13. 64位计算机很慢,win7 64位旗舰版电脑网速太慢怎么解决
  14. python 中in
  15. LabVIEW编程LabVIEW开发 施耐德
  16. 饥荒联机版服务器控制台本地和在线,服务器,控制台饥荒服务器控制台命令,指令,常用命令,管理命令 - Welcome to XiongTianQi.CN...
  17. 用switch语句根据消费金额计算折扣 (Java经典编程案例)
  18. ROS-Melodic 编译Moveit全过程记录和错误解决方案
  19. 产品设计-13.制作产品结构图
  20. 两种经过验证的设计相结合:带有低温探针台的 8425 型直流霍尔系统

热门文章

  1. 将Tomcat加入windows系统服务
  2. silverlight 自定义资源整理(待后续补充)
  3. [和管子对话] 2 2007-4-6/抽象类和接口的谁是谁非
  4. 华为RH2285H V2设备管理口白屏的解决方法
  5. Servlet Session 跟踪
  6. 03-20 专项测试-APP 启动性能分析
  7. c++用一级运算比较大小_Python 学习笔记:Python 中的数字和数字型运算
  8. python爬取豆瓣电影top250_用Python爬虫实现爬取豆瓣电影Top250
  9. 金融数据分析与挖掘实战1.4.4-1.5.1
  10. 学习JavaScript需要什么基础?