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 ...
随机推荐
- 毕业设计之LVS+keealive 负载均衡高可用实现
环境介绍 centos6.9最小化安装 主机名 IPADDR lvsA.load.quan.bbs 192.168.111.131 lvsB.load.quan.bbs 192.168.111.132 ...
- 嵌入式Linux利用ppp实现4G模块联网
https://blog.csdn.net/qq361294382/article/details/52136126 https://blog.csdn.net/qq361294382/article ...
- phpexcel 另存Excel文件方式
$w = new PHPExcel_Writer_Excel5($e); $dir = 'path/title.xls'; $w->save($dir);
- Linux驱动实践:如何编写【 GPIO 】设备的驱动程序?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- 疯了吧!这帮人居然用 Go 写“前端”?(一)
作者 | 郑嘉涛(羣青) 来源 | 尔达 Erda 公众号 无一例外,谈到前后端分离"必定"是 RESTful API,算是定式了.但我们知道 REST 在资源划分上的设计总是 ...
- Spark 广播变量和累加器
Spark 的一个核心功能是创建两种特殊类型的变量:广播变量和累加器 广播变量(groadcast varible)为只读变量,它有运行SparkContext的驱动程序创建后发送给参与计算的节点.对 ...
- C++11的auto自动推导类型
auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...
- 循环队列/顺序队列(C++)
队列(queue)是一种限定存取位置的线性变.他允许在表的一端插入,在另一端删除.这个和计算机调度策略中的先来先服务FCFS(First Come/First Served)是一样的.队列中可以插入的 ...
- Oracle参数文件—pfile与spfile
oracle的参数文件:pfile和spfile 1.pfile和spfile Oracle中的参数文件是一个包含一系列参数以及参数对应值的操作系统文件.它们是在数据库实例启动时候加载的, ...
- [项目总结]Android 手动显示和隐藏软键盘
1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) 1 InputMethodManager imm = (InputMethodManager) getSystemService(Cont ...