代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做。 

1、概述

  命令模式是一种数据驱动的模式。将请求封装到命令的对象中,再传给调用对象,调用对象再处理该命令。

  【将一个请求封装为一个对象】

  顺序就是:调用者-> 命令-> 接收者。 故需要定义3个角色: 1、命令的真正执行对象,2、具体的命令,3、invoker,也就是i请求者。

  好处: 因为模型已经定下来,所以,额外增加一条命令会轻松许多,但是(缺点)很明显,命令多了,系统慢慢就复杂了 。

  类比生活中的场景: 键盘按键,还有界面控件。

下面以买卖商品为例:

2、一个抽象命令的类

// 创建一个命令接口
class oct_cmd
{
public:
virtual void execute() = 0;
};

3、invoker, 请求者

//  invoker, 将请求封装为一个类,
class oct_invoker
{
public:
oct_invoker() : name(std::string("apple")),
quantity(10) {} void buy()
{
std::cout << "\ninvoker [name = " << name.c_str() << "], [quantity=" << quantity << "] bought \n";
} void sell()
{
std::cout << "\ninvoker [name = " << name.c_str() << "], [quantity=" << quantity << "] sold \n";
} private:
std::string name;
int quantity;
};

4、命令A, 执行购买,继承上面的命令

// 命令A,执行购买, 请求可能有多个,这里就有2个指令,分别对应请求中的接口
class oct_cmd_buy : public oct_cmd
{
public:
// 初始化请求者
void init_invoker(const oct_invoker& instance)
{
_invoker = instance;
} // 重写父类,执行请求者buy的命令
void execute()
{
_invoker.buy();
} private:
// 请求者
oct_invoker _invoker;
};

5、命令B执行销售,

// 命令B,执行售卖
class oct_cmd_sell : public oct_cmd
{
// 初始化请求者
void init_invoker(const oct_invoker& instance)
{
_invoker = instance;
} // 重写父类,执行请求者buy的命令
void execute()
{
_invoker.sell();
} private:
// 请求者
oct_invoker _invoker;
};

6、命令调用类

// 创建命令调用类
class oct_call_cmd
{
public: // 添加命令,
void init_cmd(oct_cmd *pcmd)
{
if (pcmd)
_arr_cmd.push_back(pcmd);
} // 执行命令
void carry_out_cmd()
{
for each (auto item in _arr_cmd)
item->execute(); // 释放空间
clear_vector<oct_cmd *>(_arr_cmd);
} private:
// 可能有很多命令
std::vector<oct_cmd *> _arr_cmd;
};

7、调用

 1 void call_command()
2 {
3 oct_invoker invoker_cmd;
4 std::unique_ptr<oct_cmd> pcmd_sell(new(std::nothrow) oct_cmd_sell);
5 std::unique_ptr<oct_cmd> pcmd_buy(new(std::nothrow) oct_cmd_buy);
6 std::unique_ptr<oct_call_cmd> pcall_cmd(new(std::nothrow) oct_call_cmd);
7
8 if (!pcmd_buy || !pcmd_buy || !pcall_cmd)
9 {
10 std::cout << "\n命令 sell 和 命令 buy 创建失败\n";
11 return;
12 }
13
14
15 // 添加命令
16 pcall_cmd->init_cmd(pcmd_sell.get());
17 pcall_cmd->init_cmd(pcmd_buy.get());
18
19 // 执行命令
20 pcall_cmd->carry_out_cmd();
21 }

8、输出结果

c++设计模式概述之命令的更多相关文章

  1. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  2. PHP设计模式概述

    PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  3. java设计模式概述

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...

  4. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  5. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  6. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  7. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  8. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  9. 【OOAD】设计模式概述

    模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...

随机推荐

  1. 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)

    题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...

  2. PDO的好处

    产生原因 普通的SQL执行语句,由于研发人员对前端请求参数过滤不严谨,导致SQL被注入,从而影响数据库,带来风险 使用PDO后形成的语句 SELECT * FROM test WHERE id in ...

  3. for no other reason than because

    在狄更斯的<A Child History of England>中有段话: After some disputing among the priests, who said that a ...

  4. acquaint

    Interpersonal relationships are dynamic systems that change continuously during their existence. Lik ...

  5. 在 windows 系统上 安装与配置 PHP + Apache

    参考:http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html 在大学时候上过一门PHP课时,因为课堂需要配置过一次PHP+Mysql ...

  6. C++自定义字符串类

    //header.h #ifndef _HEADER_H #define _HEADER_H #define defaultSize 128 #include<iostream> #inc ...

  7. OkHttp3 使用

    导入 compile 'com.squareup.okhttp3:okhttp:3.3.0' GET请求 String url = "https://www.baidu.com/" ...

  8. SQL count和sum

    count(1).count(*)与count(列名)的执行区别 count(1) and count(字段) 两者的主要区别是 (1) count(1) 会统计表中的所有的记录数,包含字段为null ...

  9. 【Services】【Web】【Nginx】静态下载页面的安装与配置

    1. 拓扑 F5有自动探活机制,如果一台机器宕机,请求会转发到另外一台,省去了IPVS漂移的麻烦 F5使用轮询算法,向两台服务器转发请求,实现了负载均衡 2. 版本: 2.1 服务器版本:RHEL7. ...

  10. Spring Boot项目的不同启动方式

    方式一: 直接通过IntelliJ IDEA启动,直接执行Spring Boot项目的main()方法. 方法二: 将项目打包成jar包,首先需要在pom.xml文件的根节点下添加如下配置: < ...