设计模式系列3-----C++实现命令模式(Command Pattern)
什么是命令模式?
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)相关推荐
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 设计模式:命令模式(Command Pattern)
命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 解读设计模式----命令模式(Command Pattern)
***本文与作者原文有一定的偏差,其中加入了一部分是个人看法,详细请查看作者原文.*** 原文连接http://www.dofactory.com/Patterns/PatternCommand.as ...
- 32命令模式(Command Pattern)
耦合与变化: 耦合是软件不能抵御变化灾难的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系. ...
- 命令模式(Command pattern)及代码实现
模式定义: 将客户端的请求封装成一个对象(这个对象就是 命令对象),使请求的发送者 和请求的接收者 进行 责任分离解耦, 这样 两者只通过 命令进行交互;发送者 不关心 请求的具体实现细节, 接收者 ...
- 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)
五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- Java设计模式之行为型:命令模式
前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...
最新文章
- Pytorch框架的深度学习优化算法集(优化中的挑战)
- Java数组和Arrays类
- 作为一个新晋测试经理,在软件测试计划之前你必须知道的10件事
- 红橙Darren视频笔记 builder设计模式+navigationBar导航条
- 剑指Offer之寻找二叉树下一个节点
- 超 60 万 GPS 定位服务被曝漏洞,用户信息或将暴露!
- Can't save in background: fork: Cannot allocate memory
- 109. 有序链表转换二叉搜索树
- Pikachu靶机系列之目录遍历、任意文件下载、敏感信息泄露、越权
- Mac 修改 hosts 文件
- 在哪下拼多多上传助手?拼多多软件方法介绍
- ArcGIS:计算土地转移矩阵
- 什么是架构师?Java架构师一般多少年薪呢?
- html背景图片定位方法
- 基于SSM+SpringBoot+MySQL+LayUI的高校学生评教系统
- mysql 集群 运维_【MySQL运维】Canal集群模式与多数据库同步部署
- python(re 模块-正则表达式)
- 杭电c语言课程设计短学期第七次作业,杭电短学期数字电子钟整点报时系统实验报告...
- python发送邮件(一)
- 万法简史(肯威尔伯)
热门文章
- string to xml java_Java String to XML - Parse String to XML DOM Example - 入门小站-rumenz.com
- matlab在命令行注册,命令行运行matlab
- 安装 Arduino IDE 中STM32 软件包,ESP8266软件包
- 声音信标发出白噪声和发出chirp信号的对比测距说明
- 逐飞科技对于STC8H1K系列的单片机正交解码的资料以及实验
- 如何利用cnocr 识别七段数码?
- 低内阻的MOS管 4N04R7
- 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解
- 以太网未识别的网络win10_工业以太网典型应用、常见故障、冗余网络技术及实例...
- datanucleus mysql_DataNucleus Access Platform 3.1.2发布