什么是命令模式?

GoF的书的定义为:“Command pattern encapsulate request as an object, thereby letting you parameterize clients with different request, queue or log request, and support undoable operations”

换言之,讲命令封装成一个对象,既有状态也能执行动作,发出命令者不需要知道命令最终是谁执行的,如何执行,它只依赖抽象。而且调用者可以根据命令纪录,维护一个命令队列,或者log所有的命令。命令模式也可以方便的实现撤销操作。

类图结构:

Example:

例子模拟游戏里给人发出移动和跳的命令,Player对应于类图里面的Receiver,代码如下。

#include <iostream>
using namespace std;class Player
{
public:void move(int x, int y){cout << "player move to (" << x << ", " << y << ")" << endl;}void jump(){cout << "player jump" << endl;}
};class Command
{
public:virtual void execute() = 0;
};class MoveCommand : public Command
{
public:MoveCommand(Player* pPlayer, int x, int y): m_pPlayer(pPlayer), m_intX(x), m_intY(y) { }virtual void execute(){if (m_pPlayer)m_pPlayer->move(m_intX, m_intY);}private:Player* m_pPlayer;int m_intX, m_intY;
};class JumpCommand : public Command
{
public:JumpCommand(Player* pPlayer) : m_pPlayer(pPlayer) {}virtual void execute(){if (m_pPlayer)m_pPlayer->jump();}private:Player* m_pPlayer;
};class Invoker
{
public:void takeOrder(Command* pCommand){pCommand->execute();delete pCommand;}
};int main()
{Player* pPlayer = new Player();Invoker invoker;char orderType;while (cin >> orderType){int x, y;if (orderType == 'm' && cin >> x >> y)invoker.takeOrder(new MoveCommand(pPlayer, x, y));else if (orderType == 'j')invoker.takeOrder(new JumpCommand(pPlayer));}delete pPlayer;return 0;
}
 
可以对Invoker修改使它支持命令队列的功能,使它包一个装命令的容器,当里面有命令的时候取出来执行。
 
参考资料:
PatternCraft – Command Pattern(非常好!)

<<Head First Design Pattern>>

<<Design Patterns—Elements of Reusable Object-Oriented Software>>

转载于:https://www.cnblogs.com/graphicsme/archive/2011/12/06/2278634.html

设计模式系列3-----C++实现命令模式(Command Pattern)相关推荐

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

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

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

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

  3. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  4. 解读设计模式----命令模式(Command Pattern)

    ***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.as ...

  5. 32命令模式(Command Pattern)

    耦合与变化:     耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系.                               ...

  6. 命令模式(Command pattern)及代码实现

    模式定义: 将客户端的请求封装成一个对象(这个对象就是 命令对象),使请求的发送者 和请求的接收者 进行 责任分离解耦, 这样 两者只通过 命令进行交互;发送者 不关心 请求的具体实现细节, 接收者 ...

  7. 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)

    五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...

  8. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  9. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

最新文章

  1. Pytorch框架的深度学习优化算法集(优化中的挑战)
  2. Java数组和Arrays类
  3. 作为一个新晋测试经理,在软件测试计划之前你必须知道的10件事
  4. 红橙Darren视频笔记 builder设计模式+navigationBar导航条
  5. 剑指Offer之寻找二叉树下一个节点
  6. 超 60 万 GPS 定位服务被曝漏洞,用户信息或将暴露!
  7. Can't save in background: fork: Cannot allocate memory
  8. 109. 有序链表转换二叉搜索树
  9. Pikachu靶机系列之目录遍历、任意文件下载、敏感信息泄露、越权
  10. Mac 修改 hosts 文件
  11. 在哪下拼多多上传助手?拼多多软件方法介绍
  12. ArcGIS:计算土地转移矩阵
  13. 什么是架构师?Java架构师一般多少年薪呢?
  14. html背景图片定位方法
  15. 基于SSM+SpringBoot+MySQL+LayUI的高校学生评教系统
  16. mysql 集群 运维_【MySQL运维】Canal集群模式与多数据库同步部署
  17. python(re 模块-正则表达式)
  18. 杭电c语言课程设计短学期第七次作业,杭电短学期数字电子钟整点报时系统实验报告...
  19. python发送邮件(一)
  20. 万法简史(肯威尔伯)

热门文章

  1. string to xml java_Java String to XML - Parse String to XML DOM Example - 入门小站-rumenz.com
  2. matlab在命令行注册,命令行运行matlab
  3. 安装 Arduino IDE 中STM32 软件包,ESP8266软件包
  4. 声音信标发出白噪声和发出chirp信号的对比测距说明
  5. 逐飞科技对于STC8H1K系列的单片机正交解码的资料以及实验
  6. 如何利用cnocr 识别七段数码?
  7. 低内阻的MOS管 4N04R7
  8. 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解
  9. 以太网未识别的网络win10_工业以太网典型应用、常见故障、冗余网络技术及实例...
  10. datanucleus mysql_DataNucleus Access Platform 3.1.2发布