设计模式-命令模式(Command Pattern)

承接Qt/C++软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系!

一、命令模式的说明

        命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装成对象,从而使得可以将请求参数化、队列化、并且可以用不同的请求来参数化客户端(调用者)的对象。这个模式也支持可撤销的操作。

命令模式通常包括以下几个角色:

        Command(命令): 定义了执行操作的接口,通常包括执行方法(execute())和可能的撤销方法(undo())。

        ConcreteCommand(具体命令): 实现了Command接口,持有执行操作所需的相关信息,包括对接收者对象的引用。

        Invoker(调用者): 请求的发送者,通过命令对象来执行请求。

        Receiver(接收者): 实际执行操作的对象。

二、命令模式的场景

        命令模式在实际应用中有很多常见的案例,以下是其中一些常用的情况:

        菜单和按钮操作:在图形用户界面(GUI)应用程序中,菜单项和按钮通常可以被抽象为命令对象。当用户点击菜单项或按钮时,相应的命令被执行,这样做的好处是可以将用户操作与具体的执行操作解耦。

        多级撤销(Undo)操作:命令模式支持撤销操作,因此它在需要实现撤销多个步骤的应用程序中很有用。每个命令对象可以保存执行操作的状态,以便在撤销时恢复到先前的状态。

        任务调度器:命令模式可以用于实现任务调度器,其中每个任务可以被封装成一个命令对象,并且可以按照一定的顺序执行。

        日志记录:命令模式可以用于实现日志记录系统,每个命令对象的执行都可以被记录下来,从而实现日志记录功能。

        遥控器和家电控制:像前面示例中的遥控器一样,命令模式常用于实现遥控器和家电的控制系统。每个按钮可以关联一个命令对象,当按下按钮时,执行相应的命令。

        数据库事务处理:在数据库操作中,命令模式可以用于实现事务处理,每个数据库操作可以被封装成一个命令对象,事务的提交或回滚可以看作是对一系列命令对象的执行或撤销。

三、命令模式的优缺点

优点:

        解耦调用者和接收者:命令模式通过将请求封装成独立的命令对象,从而解耦了请求的发送者和接收者。这使得系统中的对象不需要知道彼此的细节,降低了对象之间的耦合度,提高了系统的灵活性。

        支持撤销和重做:由于命令对象通常会保存执行所需的状态信息,因此可以很容易地支持撤销和重做操作。这对于实现撤销历史记录、撤销栈等功能非常有用。

        支持命令的排队执行:命令模式可以将请求排队,并按照一定的顺序执行。这对于实现任务调度器等功能很有用。

        容易扩展:通过添加新的命令类和接收者类,可以很容易地扩展命令模式,而不需要修改现有的代码。这样使得系统更加灵活和可扩展。

        中心化控制:命令模式将请求封装成对象,使得可以在系统中集中控制命令的执行。这样可以更好地管理和维护系统的行为。

缺点:

        类爆炸:如果系统中有大量的命令类和接收者类,可能会导致类的数量急剧增加,从而增加了系统的复杂性。

        可能引入过多的代码:在某些情况下,引入命令模式可能会增加过多的代码量,特别是对于简单的功能而言,直接调用函数可能更加简单和直接。

        增加了系统的复杂性:命令模式增加了系统中的额外的抽象层次,可能会增加系统的理解和维护成本。

        不适用于所有情况:命令模式并不适用于所有的情况,特别是对于简单的功能而言,引入命令模式可能会显得过于复杂。

        可能降低执行效率:由于命令模式需要将请求封装成对象,可能会导致额外的性能开销,特别是在系统需要频繁创建和销毁命令对象的情况下。

四、命令模式的代码

#include <iostream>
#include <string>
#include <memory>// Command Interface
class Command {
public:virtual ~Command() {}virtual void execute() = 0;
};// Receiver
class Light {
public:void turnOn() {std::cout << "Light is on\n";}void turnOff() {std::cout << "Light is off\n";}
};// Concrete Command
class TurnOnCommand : public Command {
public:TurnOnCommand(std::shared_ptr<Light> light) : m_light(light) {}void execute() override {m_light->turnOn();}
private:std::shared_ptr<Light> m_light;
};class TurnOffCommand : public Command {
public:TurnOffCommand(std::shared_ptr<Light> light) : m_light(light) {}void execute() override {m_light->turnOff();}
private:std::shared_ptr<Light> m_light;
};// Invoker
class RemoteControl {
public:void setCommand(std::shared_ptr<Command> command) {m_command = command;}void pressButton() {m_command->execute();}private:std::shared_ptr<Command> m_command;
};int main() {// Receiverstd::shared_ptr<Light> light = std::make_shared<Light>();// Concrete Commandsstd::shared_ptr<Command> turnOnCommand = std::make_shared<TurnOnCommand>(light);std::shared_ptr<Command> turnOffCommand = std::make_shared<TurnOffCommand>(light);// InvokerRemoteControl remote;// Set commandsremote.setCommand(turnOnCommand);remote.pressButton(); // Output: Light is onremote.setCommand(turnOffCommand);remote.pressButton(); // Output: Light is offreturn 0;
}

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

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

相关文章

跨境代购系统独立站:掌握核心竞争优势,打造专业国际购物体验

跨境代购系统独立站&#xff08;获取代购系统独立站演示&#xff09;的核心竞争优势可能包括&#xff1a; 独立性&#xff1a;独立站不依赖于任何第三方电商平台&#xff0c;拥有自己的域名和网站空间&#xff0c;可以自主控制网站的设计和内容。灵活性&#xff1a;独立站不受…

springboot基于web的网上摄影工作室的开发与实现论文

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足&#xff0c;创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

微信小程序云开发教程——墨刀原型工具入门(动态组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

0基础跨考计算机|408保姆级全年计划

我也是零基础备考408&#xff01; 虽说是计算机专业&#xff0c;但是本科一学期学十几门,真的期末考试完脑子里什么都不进的...基本都是考前一周发疯学完水过考试...&#x1f605; 想要零基础跨考可以直接从王道开始&#xff01;跟教材一点一点啃完全没必要&#x1f978; 现在…

八股文打卡day25——数据库(2)

面试题&#xff1a;讲一下事务的四大特性&#xff1f; 我的回答&#xff1a; ACID A代表原子性&#xff0c;一个事务代表一个业务&#xff0c;要么全部都完成&#xff0c;要么全部都不完成。如果事务执行失败了&#xff0c;会回滚到最原来的状态。 C代表一致性&#xff0c;举…

【STM32】江科大STM32学习笔记汇总(50)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…

venv、pip、conda、anaconda、miniconda的区别和优缺点,和彻底清除python多余的环境

virtualenv(venv) 这是一个虚拟环境管理器&#xff0c;它可以让你每个项目甚至每个脚本配置一个自定义的Python解释器环境&#xff0c;这最大的好处是我可以不污染开发环境。​ pip pip 是 Python 最常用的包管理器&#xff0c;它能自动处理依赖 。 conda 如果说venv是虚拟…

CSS特性

小技巧&#xff1a;在调试工具中&#xff0c;css样式上看层叠&#xff0c;下看继承。 1、层叠性 相同的属性会被覆盖&#xff0c;不同的属性会叠加 2、继承性 3、优先级 基于不同种类的选择器的匹配规则。 通配符 < 标签 < 类选择器 < id选择器 < 行内样式 <…

大语言模型(LLM)技术名词表(一)

LLMs on a Phone&#xff1a;指在手机设备上运行的大型语言模型。 Scalable Personal AI&#xff1a;指用户可以在个人设备上对AI模型进行微调的技术。 Responsible Release&#xff1a;发布AI模型时考虑社会、法律和伦理影响的做法。 Multimodality&#xff1a;AI模型能处理…

一起玩儿平衡车(ESP32)——02 平衡车的组装与接线方法

摘要&#xff1a;本文介绍平衡车的组装与接线方法 前边介绍了所要实现的平衡车的组成&#xff0c;接下来就来把小车组装起来。首先是下层底板的底面要固定两个轮子。这个只要固定孔位没有问题&#xff0c;用螺丝直接将轮子支架固定上去就可以了。固定好后如下图所示&#xff1…

基础小白快速入门c语言--

变量&#xff1a; 表面理解&#xff1a;在程序运行期间&#xff0c;可以改变数值的数据&#xff0c; 深层次含义&#xff1a;变量实质上代表了一块儿内存区域&#xff0c;我们可以将变量理解为一块儿内存区域的标识&#xff0c;当我们操作变量时&#xff0c;相当于操作了变量…

代码随想录算法训练营Day38|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 题目链接&#xff1a;509. 斐波那契数 文档链接&#xff1a;509. 斐波那契数 视频链接&#xff1a;手把手带你入门动态规划 | LeetCode&#xff1a;509.斐波那契数 C实现 class Solution { public:int fib(int n) {if(n 0) return 0;if(n 1) return 1;int a…

罐头鱼AI传单功能操作说明|二次剪辑创作|AI智剪|批量剪辑视频

罐头鱼AI传单功能操作说明 1. 首页显示 账号登录状态 可绑定账号数量 已绑定账号数量 已绑定账号显示 显示最近上传视频素材 显示新上传素材列表 QQ:290615413 2. 抖音账号绑定功能 显示登录账号 已绑定账号 可绑定账号数量 可授权绑定抖音账号 3. 账号管理列表 显…

Netty5 入门HelloWorld

一、客户端代码及关键类说明 /*** netty5的客户端* author -zhengzx-**/ public class ClientSocket {public static void main(String[] args) {//服务类Bootstrap bootstrap new Bootstrap();//workerEventLoopGroup worker new NioEventLoopGroup();try {//设置线程池boo…

RC正弦波振荡电路

RC正弦波振荡电路 RC正弦波振荡电路又称文氏电桥振荡电路&#xff0c;可以设计频率为f1/2πRC的正弦波发生器。 RC正弦波振荡电路设计&#xff1a;50Hz,振幅为3.47V 电路分析&#xff1a; 1.起振条件取决于R1, R4&#xff0c;R2与1N4148并联电阻&#xff08;下面简称Rf&#…

B端系统:OA界面设计,把用户当傻瓜吧, 少让用户吃瓜

OA系统是稍具规模的企业最常用的系统&#xff0c;有些OA系统体验非常逆天&#xff0c;把用户当成了吃瓜群众&#xff0c;看看热闹还行&#xff0c;一旦上手操作就抓瞎了&#xff0c;大千UI工场结合自身经验对这个问题进行分析&#xff0c;希望可以抛砖引玉。 一、OA概述 OA系…

【飞桨EasyDL】飞桨EasyDL发布的模型转换onnx(附工程代码)

一个愿意伫立在巨人肩膀上的农民...... 一、paddle转onnx转rknn环境搭建 paddle转onnx和onnx转rknn两个环境可以分开搭建&#xff0c;也可以搭建在一起。这里选择分开搭建&#xff0c;先搭建paddle转onnx。 1.1、创建环境 选择python3.8.13包进行创建环境 conda create --nam…

Day09:基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

目录 算法加密-概念&分类&类型 加密解密-识别特征&解密条件 解密实例-密文存储&数据传输 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&am…

电子科技大学《数据库原理及应用》(持续更新)

前言 电子科技大学的数据库课程缩减了部分的课时&#xff0c;因此&#xff0c;可能并不适合所有要学习数据库的宝子们&#xff0c;但是&#xff0c;本人尽量将所有数据库的内容写出来。本文章适用于本科生的期中和期末的复习&#xff0c;电子科技大学的考生请在复习前先看必读…

MySQL相关知识汇总

MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;它以其高性能、稳定性和易用性而备受开发者喜爱。在软件开发领域&#xff0c;无论是大型项目还是小型应用&#xff0c;MySQL都扮演着重要的角色。本文将对MySQL的一些关键知识点进行汇总&#xff0c;帮助读者更好地了…