作者:一雨田( http://blog.csdn.net/dylgsy/ )。本文欢迎转贴,并请保留此信息

在现实的情况中,有一个实例能非常贴切的描述了Command模式,这就是皇帝和士兵的关系。皇帝作为调用者,士兵 是接收者,试想如果皇帝要下达一个命令给士兵,难道他直接跑到这个士兵的前面向他交代命令的细节,然后,士兵领旨执行吗?对于皇帝来说,这是不可能的,因 为对皇帝来说,他只想完成某个任务,而谁去帮他完成是无关重要的,所以皇帝就有一种东西叫做圣旨,他只需要下一道圣旨,那谁领旨就与他无关了。

在Command模式中,皇帝就是Invoker、Command就是圣旨、士兵就是接收者。示意图如下:

下面针对这个模式来说明一下
Command模式包括几个关键类,Invoker(调用者)、Command(命令)、Receiver(接受者)
我 们先看看这个模式是如何协作完成的。调用者和接收者通过Command对象来解耦,Command中有一个Receiver的对象,而Invoker中调 用Command对象的统一函数Execute,Execute函数才真正调用Receiver中的函数。看到这里,想一下,为什么Invoker不直接 调用Receiver中的函数呢?
因为:
1、有些情况下,调用者不知道接收者实际是什么(象皇帝不知道谁领旨了),那我们的接收者就有一个变化的可能了。
2、有些情况下,接收者的接口很混乱,调用者希望有一个统一的接口让他调用。例如可以实现Execute和UnExecute来实现Undo操作。
3、其他的,暂时我也只能想到上述的两个使用Command的原因。其他的应用如果有朋友知道,请告知!

下面我们可以看看模拟皇帝的代码,了解一下Command的代码是怎么组织的:

#include <stdio.h>
#include <iostream>
using namespace std;

// 圣旨类(Command类)
class Command
...{
public:
    virtual ~Command()
    ...{
    }

    // 统一的函数接口
    virtual void Execute() = 0;
};

// 士兵(圣旨的接收者)
class Receiver
...{
public:
    Receiver(char *pszName)
    ...{
        strcpy(szName, pszName);
    }
    void Action()
    ...{
        cout << szName << "领旨!" << endl;
    }

private:
    // 每个士兵有一个名字
    char szName[20];
};

// 具体的圣旨1——抓贼
class ZhuaZeiCommand: public Command
...{
public:
    ZhuaZeiCommand(Receiver *r) : _recver(r)
    ...{

    }
    virtual void Execute()
    ...{
        cout << "谁领抓贼圣旨?" << endl;
        _recver->Action();
    }

private:
    Receiver *_recver;
};

// 具体的圣旨2——送钱
// 哪来什么送钱的圣旨?我晕
class SongQianCommand: public Command
...{
public:
    SongQianCommand(Receiver *r) : _recver(r)
    ...{

    }
    virtual void Execute()
    ...{
        cout << "谁领送钱圣旨?" << endl;
        _recver->Action();
    }

private:
    Receiver *_recver;
};

// 皇帝类
class Invoker
...{
public:
    Invoker(Command *c) : _cmd(c)
    ...{
    }
    void Invoke()
    ...{
        _cmd->Execute();
    }

private:
    Command *_cmd;
};


// 这个main函数就是应用,我一般把main函数看作是上帝的剧本
// 不是吗?你想要的一切都可以由你来创造,呵呵
void main()
...{
    // 有两个士兵
    Receiver r1("一雨田");
    Receiver r2("邓一雷");

    // 两道圣旨,一道是抓贼的,一道是送钱的

    // 抓贼的给一雨田
    ZhuaZeiCommand     zc(&r1);
    // 送钱的给邓一雷
    SongQianCommand sc(&r2);    

    // 有一个皇帝,要下圣旨了

    // 第一道,下的是抓贼圣旨
    Invoker I1(&zc);
    
    // 第二道,下的是送钱圣旨
    Invoker I2(&sc);
    
    // 圣旨的执行
    I1.Invoke();
    I2.Invoke();
}

设计模式简单代码之Command模式(皇帝圣旨篇)相关推荐

  1. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  2. php设计模式简单代码,PHP设计模式(1)工厂模式

    工厂模式 是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改是所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 比方说我 ...

  3. PHP 设计模式 简单工厂和工厂模式

    工厂模式是创建型模式的一种,分为简单工厂模式,工厂模式,抽象工厂模式,简单工厂可以称之为工厂模式的一个特例 先用一段简单的代码说明一下,现在假设我们是顾客,需要苹果味饮料和香蕉味饮料 <?php ...

  4. 行为型设计模式(3)—— 命令模式(Command Pattern)

    文章目录 1.概述 2.命令模式简单实现 3.命令模式的应用场景和优缺点 4.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.命令模式(Command Pattern ...

  5. 设计模式-简单总结(不涉及代码,有需要戳)

    引言 在学习设计模式之前,有几点必须要给自己和大家说一下.我真的是一个强迫症很强的人哎,前些天也在整理有关设计模式的代码,你能想象到仅仅是一个单例模式,一个最简单的设计模式我就写了将近十个的Java文 ...

  6. 【设计模式】Command模式

    最近想开始多学习一下工作中代码常常使用的设计模式. 除单例模式,工厂模式之外,command模式用的也是比较多的. 在学习了"正统"的设计模式之后,再来看实际项目代码中使用的类似的 ...

  7. 设计模式其实很简单之行为型模式

    关注公众号获取更多资料 设计模式- 行为型模式 ​ 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. ​ 行为型模式是23中设计模式 ...

  8. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  9. 设计模式--简单工厂模式

    什么是工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对 ...

最新文章

  1. 详解 Vue Vuex 实践
  2. 【PHPExcel】数学公式
  3. java语言基础特性
  4. Know more about AWR Parse Statistics
  5. JS跨域控制IFrame高度自适应
  6. 富士施乐3065扫描教程_全面支持IT国产化 富士施乐70款机型获统信UOS兼容认证
  7. kernel shell bash简介
  8. 一文理解设计模式之--观察者模式(Observer)
  9. VRAR产业峰会暨第二届华为VR开发应用大赛颁奖典礼在和平区成功举办
  10. (53)Xilinx时钟原语-BUG与IBUFG(第11天)
  11. 二叉树中进行 BFS 和图中进行 BFS 最大的区别
  12. php ajax session,Ajax处理用户session失效
  13. Ceisum官方教程1 -- 开始
  14. 13.企业应用架构模式 --- 对象-关系元数据映射模式
  15. 辟谣!微信支付宝收款码将不能用于经营性收款?
  16. 锐龙r3 4100核显 r3 4100参数 r3 4100评测
  17. 跟着迪哥学python 经管之家_跟着迪哥学:Python数据分析与机器学习实战
  18. 关于融云在APIcloud中的集成
  19. 域账户或者本地用户,每次开机登陆都重置桌面
  20. bt面板增加多个站点用同一个IP

热门文章

  1. SpringCloud-3-Ribbon
  2. 今夏成为小葫芦娃的最后机会!
  3. 基于matlab的多径信道的仿真
  4. Mybatis再学习
  5. 下一个行业风口:NFT 数字藏品,是机遇还是泡沫?
  6. spark内核SortShuffle解析_大数据培训
  7. 足球数据API接口 - 【即时指数2】API调用示例代码
  8. Python生成器的throw和close方法
  9. JDBC插入数据后返回新数据id
  10. 银河麒麟批量压缩图片的方法