C++ 设计模式之命令模式

C++ 设计模式之命令模式

简介

1、命令模式 (Command)是一种行为型设计模式,它将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

2、命令模式 (Command)应用场景包括但不限于:
2.1、需要将请求调用者和请求接收者解耦时。
2.2、需要支持撤销(Undo)和重做(Redo)操作时。
2.3、当系统需要支持命令的排队执行和历史记录功能时。
2.4、当系统需要组合命令,形成宏命令时。

3、命令模式 (Command)的构成
3.1、命令接口

class Command
{
public:virtual ~Command() {};virtual void execute() = 0;
};

3.2、具体命令

class Light
{
public:void on();void off();
};

3.3、命令执行对象

class LightOnCommand : public Command
{
public:LightOnCommand(Light& li);void execute();
private:Light& light;
};

4、命令模式 (Command)的优点
4.1、解耦:调用方(客户端)和接收方(接收器)之间没有直接关系,双方只通过命令对象进行通信,更易于维护和扩展。
4.2、扩展性:新增命令或者改变命令的实现不会影响现有的其他类,符合开闭原则。
4.3、组合命令:可以将多个简单命令组合成一个复合命令(宏命令),方便执行多个操作。
4.4、支持撤销/重做:命令通常可以做到“可撤销”,容易实现操作的撤销和重做。
4.5、更好的控制:可以对命令进行排队和记录,以及在无需知道命令具体实现的情况下进行其他操作。

5、命令模式 (Command)的缺点
5.1、类膨胀:每个单独的命令都需要一个新的类进行包装,当命令多时类的数量会急剧增加。
5.2、复杂度增加:设计和实现更加复杂,特别是需要维护历史状态和相关状态回滚时。

简单示例

1、定义

// 命令接口
class Command
{
public:virtual ~Command() {};virtual void execute() = 0;
};// 具体命令
class Light
{
public:void on();void off();
};class LightOnCommand : public Command
{
public:LightOnCommand(Light& li);void execute();
private:Light& light;
};class LightOffCommand : public Command
{
public:LightOffCommand(Light& li);void execute();
private:Light& light;
};// 调用者
class SimpleRemoteControl
{
public:SimpleRemoteControl();void setCommand(Command* commend);void buttonWasPressed();private:Command* solt;
};

2、实现

void Light::on()
{std::cout << "Light is on" << std::endl;
}void Light::off()
{std::cout << "Light is off" << std::endl;
}LightOnCommand::LightOnCommand(Light& li) : light(li)
{}void LightOnCommand::execute()
{light.on();
}LightOffCommand::LightOffCommand(Light& li) : light(li)
{}void LightOffCommand::execute()
{light.off();
}SimpleRemoteControl::SimpleRemoteControl() : solt(nullptr)
{}void SimpleRemoteControl::setCommand(Command* commend)
{solt = commend;
}void SimpleRemoteControl::buttonWasPressed()
{if (solt){solt->execute();}
}

3、调用

SimpleRemoteControl si;
Light li;
LightOnCommand lightOn(li);
LightOffCommand lightOff(li);si.setCommand(&lightOn);
si.buttonWasPressed();si.setCommand(&lightOff);
si.buttonWasPressed();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器userAgent大全及JS判断当前APP

文章目录 userAgent 检测PC/Mobile 浏览器 userAgent 大全Mobile APP userAgent 大全JS 判断当前 APP userAgent 检测 https://useragent.buyaocha.com/ PC/Mobile 浏览器 userAgent 大全 系统浏览器User-Agent字符串MacChromeMozilla/5.0 (Macintosh; Intel Mac OS X 10_12…

vue数组套对象,在动态加入属性:属性值, 导致数据不更新

一 、案例效果 [{a: 1,b:2},{a: 1,b:2}, toggle:true]导致视图不更新且数据没有响应式。这种格式是数组套对象的&#xff0c;之后由于不想在遍历一层数据变成[{a: 1,b:2,toggle:true},{a: 1,b:2,oggle:true} ] ,就直接加在对象后面了【虽然这样写法不对&#xff0c;但是&#…

LLM端侧部署系列 | 陈天奇MLC-LLM重磅升级:基于机器学习编译的通用LLM部署引擎

引言 简介 MLCEngine的聊天功能 OpenAI风格API 云端REST API Python API iOS SDK Android SDK WebLLM SDK 小结 结构化生成 支持各种平台 优化引擎性能 总结 引言 流星透疏水&#xff0c;走月逆行云。 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&am…

如何获取泛型参数【Java】

对于一个基本的类 public class BaseDao<T>{T findOne() {return T;} }它的子类 public class StudentDao extends BaseDao<StudentDao.Student>{public static class Student{}}如何获得当前类对应的泛型参数呢&#xff1f; 方法一 JDK public static void ma…

关于onlyoffice回调函数的问题

参考文档1&#xff1a;https://api.onlyoffice.com/zh/editors/callback 在官方文档中描述的十&#xff0c;文档存储服务的回调函数&#xff0c;必须要返回 {"error": 0}表示成功&#xff0c;否则将提示错误信息。 但是经过实测&#xff0c;我们只需要正常的返回2…

力扣2874.有序三元组中的最大值 II

力扣2874.有序三元组中的最大值 II 遍历j –> 找j左边最大数 和右边最大数 class Solution {public:long long maximumTripletValue(vector<int>& nums) {int n nums.size();vector<int> suf_max(n1,0);//右边最大数for(int in-1;i>1;i--){suf_max[i…

Mysql - 数据库备份和恢复

当涉及到数据库管理时&#xff0c;数据库备份和恢复是非常关键的操作。备份可以保护数据库中的重要数据免受意外删除、数据库故障或者恶意攻击的影响。同时&#xff0c;恢复操作可以帮助我们在发生意外情况时快速恢复数据库到之前的状态。在这篇文章中&#xff0c;我们将深入探…

每日一题——Python实现PAT乙级1090 危险品装箱(举一反三+思想解读+逐步优化)4千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 题目链接&#xff1a;https://pintia.cn/problem-sets/994805260223102976/exam/problems/typ…

STL工程问题

文章目录 1. vector迭代器失效问题1.1. 情况1&#xff1a;扩容导致迭代器失效1.2. 情况2&#xff1a;删除导致迭代器失效1.3. 情况3&#xff1a;尾删导致迭代器失效 2. STL怎么做内存管理3. 如何解决哈希冲突&#xff1f;4. vector手动释放内存问题5. 对象池思想 1. vector迭代…

基于SSM的校园闲置物品交易平台

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的校园闲置物品交易平台,java项目…

Advanced RAG 09:『提示词压缩』技术综述

编者按&#xff1a; 如何最大限度地发挥 LLMs 的强大能力&#xff0c;同时还能控制其推理成本&#xff1f;这是当前业界研究的一个热点课题。 针对这一问题&#xff0c;本期精心选取了一篇关于"提示词压缩"(Prompt Compression)技术的综述文章。正如作者所说&#xf…

Zookeeper 四、Zookeeper应用场景

Zookeeper是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;我们可以使用它来进行分布式数据的发布与订阅。另一方面&#xff0c;通过对Zookeeper中丰富的数据节点类型进行交叉使用&#xff0c;配合Watcher事件通知机制&#xff0c;可以非常方便地构建一系列分…

八爪鱼现金流-032,给用户发邮件提示功能

每个月的 5 号、15 号、25 号的 17:30 工资日&#xff0c;给用户发送邮件&#xff0c;提示记账月报。 您也来记账一笔吧。 然后首页能看到趋势图。 八爪鱼现金流 八爪鱼

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦&#xff1a;第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

3072. 将元素分配到两个数组中 II Hard

给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中&a…

LeetCode 算法:二叉树的右视图 c++

原题链接&#x1f517;&#xff1a;二叉树的右视图 难度&#xff1a;中等⭐️⭐️ 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代&#xff0c;算力成为支撑经济社会发展新的关键生产力&#xff0c;全球主要经济体都在加快推进算力战略布局。随着大模型持续选代&#xff0c;模型能力不断增强&#xff0c;带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用&#xff0c;根据IDC、…

【面试系列】Elasticsearch 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

java基础知识点全集

JAVA的所有知识点 一、基础的数组、数据类型、输入输出二、类与对象1. 三大特征&#xff08;1&#xff09; 封装&#xff08;2&#xff09;继承&#xff08;3&#xff09;多态 2. 类的实例化&#xff08;1&#xff09; 类通过NEW来创建&#xff08;2&#xff09; 类的继承&…

ARP认识与学习

第1步&#xff1a; 进入root模式&#xff0c;使用iwonfig或者ifconfig &#xff0c;查看目前的网段&#xff1b; iwconfig ifconfig第2步&#xff1a; 扫描网段的其他连接设备&#xff0c;根据实际的网段填写 nmap 192.168.3.0-255第3步&#xff1a; 1表示帮助转发数据&#…