工作了一天感觉好累,洗了个澡,打开电视看看有没有喜欢的节目,拿起遥控器,看着上面的按钮,忽然感觉好奇妙,我们按一开机键,电视就开了,然后...哈哈,真好玩,我按我按。细想之下这不就是一个命令模式么。

电视机是请求的接收者Receiver,

遥控器是请求的发送者ConcreteCommand,

遥控器上有一些按钮,不同的按钮对应电视机的不同操作。

抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。

显然,电视机遥控器就是一个典型的命令模式应用实例。

[cpp]view plain copy
  1. #include <iostream>
  2. #include <vector>
  3. using std::cout;
  4. using std::endl;
  5. using std::vector;
  6. using namespace std;
  7. /*
  8. 电视机是请求的接收者,
  9. 也只有它的内部有一堆指令集合可以执行各种命令,它才是命令的真正执行者
  10. 因此它有Open打开电视, Close关闭电视,Change更换频道的接口
  11. 遥控器是请求的发送者,
  12. 它内含命令的对象,
  13. 负责将这个命令发送出去,因此需要有设置命令的接口,相当于人按下遥控器的按钮
  14. 内含RunCommand运行命令的接口,它调用了命令接口的Execute执行函数
  15. 遥控器上的那些按钮,
  16. 不同的按钮对应电视机的不同操作。
  17. 抽象命令角色由一个命令接口来扮演,
  18. 有三个具体的命令类实现了抽象命令接口,
  19. 这三个具体命令类分别代表三种操作:
  20. 打开电视机、关闭电视机和切换频道。
  21. 显然,电视机遥控器就是一个典型的命令模式应用实例。
  22. */
  23. // 接收者对象, 电视才是真正命令的执行者
  24. class Television
  25. {
  26. public :
  27. void Open( )       // 打开电视
  28. {
  29. std::cout <<"打开电视" <<std::endl;
  30. }
  31. void Close( )      // 关闭电视
  32. {
  33. std::cout <<"关闭电视" <<std::endl;
  34. }
  35. void Change( )     // 切换频道
  36. {
  37. std::cout <<"更换频道" <<std::endl;
  38. }
  39. };
  40. class Command
  41. {
  42. public :
  43. virtual void Execute( ) = 0;         // 执行的接口
  44. };
  45. // 打开电视的命令
  46. class OpenCommand : public Command
  47. {
  48. public :
  49. OpenCommand(Television *tv)
  50. {
  51. m_tv = tv;
  52. }
  53. void Execute( )         // 执行的接口
  54. {
  55. //std::cout <<"打开电视" <<std::endl;
  56. m_tv->Open( );
  57. }
  58. protected :
  59. Television *m_tv;
  60. };
  61. // 关闭电视的命令
  62. class CloseCommand : public Command
  63. {
  64. public :
  65. CloseCommand(Television *tv)
  66. {
  67. m_tv = tv;
  68. }
  69. void Execute( )         // 执行的接口
  70. {
  71. //std::cout <<"关闭电视" <<std::endl;
  72. m_tv->Close( );
  73. }
  74. protected :
  75. Television *m_tv;
  76. };
  77. // 更换频道的命令
  78. class ChangeCommand : public Command
  79. {
  80. public :
  81. ChangeCommand(Television *tv)
  82. {
  83. m_tv = tv;
  84. }
  85. void Execute( )         // 执行的接口
  86. {
  87. //std::cout <<"更换频道" <<std::endl;
  88. m_tv->Change( );
  89. }
  90. protected :
  91. Television *m_tv;
  92. };
  93. // Invoker请求发送者
  94. // 要求命令对象执行请求,
  95. // 通常会持有命令对象,可以持有很多的命令对象
  96. class Control
  97. {
  98. public :
  99. void SetCommand(Command *command)
  100. {
  101. this->m_command = command;
  102. }
  103. void RunCommand( )
  104. {
  105. m_command->Execute();
  106. }
  107. protected:
  108. Command *m_command;
  109. };
  110. // 主程序其实就相当于我们人
  111. int main( )
  112. {
  113. // 我们手里有一个遥控器
  114. Control *control = new Control;
  115. // 家里有一个大彩电
  116. Television *tv = new Television;
  117. /// 首先我们打开电视机
  118. // 创建一个打开的命令, 这个命令只操纵tv这个对象
  119. Command *openCommand = new OpenCommand(tv);
  120. control->SetCommand(openCommand);
  121. control->RunCommand( );
  122. delete openCommand;
  123. // 换了好久频道也没找到好看的, 郁闷的关掉电视机
  124. // 创建一个更换频道的命令,这个命令只操纵tv这个对象
  125. Command *changeCommand = new ChangeCommand(tv);
  126. control->SetCommand(changeCommand);
  127. control->RunCommand( );
  128. delete changeCommand;
  129. // 换了好久频道也没找到好看的, 郁闷的关掉电视机
  130. // 创建一个关闭的命令, 这个命令只操纵tv这个对象
  131. Command *closeCommand = new CloseCommand(tv);
  132. control->SetCommand(closeCommand);
  133. control->RunCommand( );
  134. delete closeCommand;
  135. delete tv;
  136. delete control;
  137. return 0;
  138. }
版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme
  • 本文已收录于以下专栏:
  • C++设计模式

C++设计模式10--命令模式(二)(Command)--降低请求发送者与接收者耦合相关推荐

  1. 请求发送者与接收者解耦——命令模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/8796736 装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关 ...

  2. 设计模式之-命令模式(Command Pattern)

    命令模式(Command Pattern)是用来实现在一个请求 - 响应模型松耦合.在命令模式中,请求被发送给调用者和调用它传递给被封装的命令对象. Command对象将请求传递到接收器的适当的方法来 ...

  3. 设计模式之命令模式(Command)

    文章目录 1. 简介 1.1 作用 优缺点 1.2使用场景 现实场景 2. 实现 2.1 UML 图 2.2 代码 1. 简介 命名模式将请求封装成一个对象: 从发出者发出命令,发出者不用关心谁接收命 ...

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

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

  5. 秒懂设计模式之命令模式(Command Pattern)

    [版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/116115743 出自:shusheng0 ...

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

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

  7. 设计模式之命令模式详解

    1 概述 日常生活中,我们出去吃饭都会遇到下面的场景.我们可以将女招待理解成一个请求的发送者,用户通过它来发送一个"点餐"请求,而厨师是"点餐"请求的最终接收者 ...

  8. C++设计模式(8)——命令模式

    命令模式 亦称:动作.事务.Action.Transaction.Command 意图 命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象. 该转换让你能根据不同的请 ...

  9. 设计模式之命令模式详解(附应用举例实现)

    文章目录 1 命令模式介绍 2 命令模式详解 2.1 命令模式结构 2.2 命令模式实现 2.3 命令模式应用举例 3 实现命令队列 1 命令模式介绍 在现实生活中人们通过使用开关来控制一些电器的打开 ...

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

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

最新文章

  1. 一个比较保守的404页面
  2. MariaDB/MySQL 报错解决:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  3. JEECG弹出框提交表单
  4. Python脚本--Apache配置文件
  5. OpenCV中IplImage/CvMat/Mat转化关系
  6. Bootstrap3栅格系统布局实例
  7. Bootstrap 模态框插件Modal 的方法
  8. Github 平均 Star 为 3558 的机器学习开源项目,你错过了哪些?
  9. cocos2d怎么设置屏幕朝向?横屏 or 竖屏设置
  10. 多线程与多进程(4)
  11. java高级能力_java高级技术工程师该具备哪些能力?
  12. 查看计算机屏幕颜色软件是什么,显示器颜色校正软件,详细教您显示器颜色校正软件...
  13. android 辅助功能(无障碍)
  14. ensp模拟器使用USG6000V防火墙模拟搭建点到点的IPSec 隧道(web网页版)
  15. 解决docker报错:The container name “/mysql“ is already in use by container
  16. 【转载】损失函数 - 交叉熵损失函数
  17. bom树形结构 表设计_BOM模块常用表结构
  18. 七阶拉丁方阵_拉丁方阵【转】
  19. 别做梦了,社交产品哪有那么容易成功
  20. (JS)Javascript之Ajax

热门文章

  1. include/autoconfig.mk
  2. listview去掉底部多出的边框黑色
  3. WAMP(Windows+Apache+Mysql+PHP)环境搭建
  4. 大型网站的系统架构(摘)
  5. 系统部门岗位关联表_155页,房地产公司最为系统的岗位说明书,敬请收藏
  6. centos7 安装mysql_第02期:ClickHouse 单机部署以及从 MySQL 增量同步数据
  7. Centos7配置 SNMP服务(防火墙配置注意)
  8. SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
  9. 将页面强制保持在所属框架中
  10. 模态 - block