当前位置: 首页 > news >正文

《C++20设计模式》命令模式思考

文章目录

  • 一、前言
  • 二、分析 + 拆解
  • 1、经典命令模式
    • 2、撤销操作
    • 3、关于`Invoker`类
  • 三、实现

一、前言

哎!只要是书上写的和经典设计模式不同,我就会很伤脑筋。😩
命令模式到底是干什么的?
答:命令的发送者和接收者完全解耦

简单来说:转换了调用主体,调用主体由原来的类,变成了命令类(或者调用命令类的类)为调用主体

相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20

二、分析 + 拆解

1、经典命令模式

经典命令模式
个人觉得太复杂,没有很直观的描述出命令模式的作用。
下面是我拆解的图
请添加图片描述

具体的成员变量可成员函数大家可以先不用看,现在你只要明白一个点就可以了—— Move_Command类组合了Receiver类,所以可以由 Move_Command随意调用move方法(即这就是我说的调用主体的改变)

2、撤销操作

也就是记录一下以前没执行的状态,再还原就行了。

3、关于Invoker

Invoker类也就是命令的发送者。

举个例子:
对于游戏呢,就接收很多命令在Invoker类中,我们
Invoker类依次发送 Command类就可以了。

三、实现

#include <iostream>
#include <iterator>
#include <memory>
#include <vector>
using namespace std;
class Receiver {
private:int x;int y;public:Receiver(int x, int y) : x(x), y(y) {}void move(int dx, int dy) {x += dx;y += dy;}void show_pos() {cout << "pos:" << endl;cout << "x -->" << x << endl;cout << "y ->>" << y << endl << endl;}int get_x() { return x; }int get_y() { return y; }
};class Command {
public:virtual void excute() = 0;virtual void undo() = 0;
};class Move_Command :public Command {
private:unique_ptr<Receiver>& receiver;int x;int y;bool flag;public:Move_Command(unique_ptr<Receiver> &receiver, int x, int y) :receiver(receiver), x(y), y(y), flag(false) {}void excute() override {receiver->move(x, y);flag = true;}void undo() override {if (flag) {flag = false;receiver->move(-x, -y);}}
};class Invoke {
private:vector<shared_ptr<Command>> commands;public:Invoke *push_command(shared_ptr<Command> command) {commands.push_back(command);return this;}void excute() {for (auto it : commands) it->excute();}void undo() {for (auto it = commands.rbegin(); it != commands.rend(); it++) (*it)->undo();}
};int main() {auto invoke = make_unique<Invoke>();auto receiver = make_unique<Receiver>(5, 6);auto command_1 = make_shared<Move_Command>(receiver, 6, 6);auto command_2 = make_shared<Move_Command>(receiver, 1, 6);auto command_3 = make_shared<Move_Command>(receiver, 6, 5);receiver->show_pos();invoke->push_command(command_1)->push_command(command_2)->push_command(command_3)->excute();receiver->show_pos();invoke->undo();receiver->show_pos();return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LabVIEW中自定义Ring控件的图标
  • 第十八节 LLaVA如何按需构建LORA训练(视觉、语言、映射多个组合训练)
  • 上海外贸建站公司wordpress模板推荐
  • 【Linux进阶】文件系统7——文件系统简单操作
  • FUSE(用户空间文件系统)命令参数
  • 学懂C#编程:C# 索引器(Indexer)的概念及用法
  • 通用个人客户关系管理系统设计
  • OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦
  • Git命令常规操作
  • C++ //练习 14.45 编写类型转换运算符将一个Sales_data对象分别转换成string和double,你认为这些运算符的返回值应该是什么?
  • 电脑多开卡顿的所有原因汇总
  • IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)
  • 嵌入式底层开发 入门学习路线
  • Python深度理解系列之【排序算法——冒泡排序】
  • 使用OpenCV的absdiff函数报错
  • 深入了解以太坊
  • 网络传输文件的问题
  • [deviceone开发]-do_Webview的基本示例
  • 【347天】每日项目总结系列085(2018.01.18)
  • avalon2.2的VM生成过程
  • DOM的那些事
  • export和import的用法总结
  • github从入门到放弃(1)
  • iOS | NSProxy
  • IOS评论框不贴底(ios12新bug)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java 网络编程(2):UDP 的使用
  • leetcode46 Permutation 排列组合
  • maya建模与骨骼动画快速实现人工鱼
  • Mysql5.6主从复制
  • React-Native - 收藏集 - 掘金
  • React系列之 Redux 架构模式
  • ubuntu 下nginx安装 并支持https协议
  • ucore操作系统实验笔记 - 重新理解中断
  • Yeoman_Bower_Grunt
  • 从零开始在ubuntu上搭建node开发环境
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 数据可视化之 Sankey 桑基图的实现
  • 微信小程序填坑清单
  • 微信支付JSAPI,实测!终极方案
  • 原生Ajax
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LLM) 很笨
  • (pojstep1.1.2)2654(直叙式模拟)
  • (ZT)薛涌:谈贫说富
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (十五)使用Nexus创建Maven私服
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)Linux Shell编程——输入输出重定向
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模