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

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. Navicat 激活教程2021(Linux)

    Navicat 激活教程2021(Linux) 目录 背景 环境 激活 清理 使用 背景 Navicat 是香港卓软数字科技有限公司生产的一系列 MySQL.MariaDB.MongoDB.Oracl ...

  2. Parallel NetCDF 简介

    Parallel NetCDF API 所有C接口前加ncmpi前缀,Fortran接口前加nfmpi前缀 函数返回整数 NetCDF 状态变量 1. Variable and Parameter T ...

  3. java中接口可以继承接口

    今天阅读别人的代码才发现,接口是可以继承接口的 一个类只能extends一个父类,但可以implements多个接口. 一个接口则可以同时extends多个接口,却不能implements任何接口. ...

  4. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...

  5. A Child's History of England.10

    In the next reign, which was the reign of Edward, surnamed The Elder, who was chosen in council to s ...

  6. 【讨论】APP的免填邀请码解决方案

    00x0 具体需求 app中已注册的用户分享一个含有邀请码的二维码,分享到朋友圈新用户在朋友圈打开这个这个链接下载app.新用户安装后打开app后就自动绑定邀请码要求用户不填写任何东西 朋友老板出差给 ...

  7. 网口程序udp

    # -*- coding: utf-8 -*- """ Created on Thu Nov 12 15:02:53 2020 @author: Administrato ...

  8. linux shell中的条件判断语句

    http://bbs.chinaunix.net/thread-396805-1-1.html shell 判断语句 流程控制 "if" 表达式 如果条件为真则执行then后面的部 ...

  9. Java中方法的定义与使用

    Java中方法的定义与使用 1.方法的定义: 方法是一段可以被重复调用的代码块. 方法的声明: public static 方法返回值 方法名([参数类型 变量--]){ 方法代码体: return ...

  10. 【Linux】【Basis】块存储,文件存储,对象存储

    1. 块存储: 定义:这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver ...