c++设计模式概述之命令
代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做。
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++设计模式概述之命令的更多相关文章
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- PHP设计模式概述
PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...
- java设计模式概述
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...
- Java设计模式学习记录-命令模式
前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述
在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...
- 【OOAD】设计模式概述
模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...
随机推荐
- P7416 [USACO21FEB] No Time to Dry P
题目传送门 题意简述:给出颜色序列 \(a\),多次询问给出 \(l,r\),求涂成 \(a_l,a_{l+1},\cdots,a_r\) 的最小操作次数.每次涂色只能用一段数值更大的颜色覆盖原有的颜 ...
- 【GS文献】植物育种中基因组选择的方法、模型及展望
目录 1. GS/GP在植物育种中的角色 2. GP模型应用 3. GP模型的准确性 4. 植物育种的GS展望 5. 小结 Genomic SelectioninPlant Breeding: Met ...
- rust shadow
1 fn main() { 2 let mut demo = 12; 3 println!("{}",demo); 4 demo = 21; // 值可变,数据类型不可变 5 pr ...
- Excel-单条件和多条件匹配搜索
6.[单条件匹配搜索]有两个表格(姓名列,年龄列,收入列等),从表1总表中,把表2中人员的年龄和收入匹配出来: 方法一: 公式=VLOOKUP($S2,$O$2:$Q$5,2,0) #其中最后0< ...
- Linux-设置终端界面的字体颜色和自定义常用快捷功能
.bashrc是一个隐藏的文件,要打开并修改该文件需要: (0)命令:cd ~ (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接 ...
- sqlalchemy模块的基本使用
Python中SQLAlchemy模块通过建立orm来对数据库进行操作 1. 建表 方式1 # -*- coding:utf-8 -*- # Author:Wong Du from sqlalchem ...
- spl_autoload_register的作用
spl_autoload_register的作用 当php实例化一个类的时候,这个类如果在另外的文件,那么不用include或require的时候就会报错,为了解决这个问题,可以用spl_autolo ...
- Flannel 启动报错
[root@ ~]#: kubectl logs -f kube-flannel-plcbl -n kube-system kube-flannel I0601 16:58:55.456862 1 m ...
- 日常Java 2021/10/24
Java ArrrayList ArrayList类是一个可以动态修改的数组,没有固定大小的限制,可以在任何时候添加或者删除元素 ArrayList类在java.util包中使用之前需要引用 E:泛型 ...
- FileReader (三) - 网页拖拽并预显示图片简单实现
以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...