2023-7-10-第十五式命令模式

news2025/1/12 16:05:25


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之命令模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、命令模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

命令模式是一种行为设计模式,它将请求封装成一个对象,使得可以将请求的发送者与接收者解耦。在命令模式中,通过创建一个具体的命令对象,将请求的操作和参数进行封装,然后将该命令对象传递给调用者。这样做的好处是,可以将请求参数化、延迟执行或者将请求放入队列中等。

以下是命令模式的几个关键角色:

  • Command(命令): 定义了执行操作的接口。通常包含一个 execute() 方法,用于触发具体的操作。
  • ConcreteCommand(具体命令): 实现了 Command 接口,并且具体实现了要执行的操作。它通常会持有一个接收者对象,负责实际执行相应的业务逻辑。
  • Receiver(接收者): 执行具体操作的对象。命令模式将请求的接收者与请求的发送者解耦,通过将具体操作委托给接收者来完成任务。
  • Invoker(调用者): 负责调用命令对象执行请求。它并不知道具体的命令细节,只需调用命令的 execute() 方法即可。
  • Client(客户端): 创建具体的命令对象,并设置其接收者。客户端可以决定命令的执行顺序,可以根据需要进行命令的组合和调用。

使用命令模式可以灵活地控制和扩展请求的操作,也可以实现撤销和恢复功能。此外,命令模式还有助于解耦系统各个对象之间的关系,使得代码更加清晰、可维护和可扩展。


🐱‍🐉二、命令模式实现

以下是一个简单的C++代码示例,演示了如何使用命令模式来实现一个简单的遥控器控制电灯的开关操作。

#include <iostream>
#include <string>

// 命令接口
class Command {
public:
    virtual ~Command() {}
    virtual void execute() = 0;
};

// 具体命令1:开灯命令
class LightOnCommand : public Command {
private:
    Light& light;

public:
    LightOnCommand(Light& light) : light(light) {}

    void execute() override {
        light.on();
    }
};

// 具体命令2:关灯命令
class LightOffCommand : public Command {
private:
    Light& light;

public:
    LightOffCommand(Light& light) : light(light) {}

    void execute() override {
        light.off();
    }
};

// 接收者:电灯类
class Light {
public:
    void on() {
        std::cout << "Light is on." << std::endl;
    }

    void off() {
        std::cout << "Light is off." << std::endl;
    }
};

// 调用者:遥控器类
class RemoteControl {
private:
    Command* onCommand;
    Command* offCommand;

public:
    RemoteControl(Command* onCommand, Command* offCommand)
        : onCommand(onCommand), offCommand(offCommand) {}

    void pressOnButton() {
        onCommand->execute();
    }

    void pressOffButton() {
        offCommand->execute();
    }
};

int main() {
    // 创建接收者对象
    Light light;

    // 创建具体命令对象
    Command* lightOnCommand = new LightOnCommand(light);
    Command* lightOffCommand = new LightOffCommand(light);

    // 创建调用者对象,并设置命令
    RemoteControl remoteControl(lightOnCommand, lightOffCommand);

    // 测试开关操作
    remoteControl.pressOnButton();  // 开灯
    remoteControl.pressOffButton(); // 关灯

    // 释放资源
    delete lightOnCommand;
    delete lightOffCommand;

    return 0;
}

此示例中,使用了命令模式将电灯的开关操作封装成具体命令对象 LightOnCommandLightOffCommand。遥控器类 RemoteControl 充当调用者角色,通过调用具体命令对象的 execute() 方法来执行对应的操作。接收者角色由电灯类 Light 担任,负责实际执行开灯和关灯的动作。

编译和运行代码后,你可以看到输出结果如下:

Light is on.
Light is off.

这表明命令模式成功地将开关操作与电灯对象解耦,可以通过遥控器对象来统一控制电灯的开关。


🎉三、模块之间的关系

在命令模式中,主要涉及以下几个关键角色之间的关系:

  1. 调用者(Invoker): 调用者是一个对象,它要求执行一个具体的命令。调用者并不知道命令的具体实现细节,只需知道如何调用命令的 execute() 方法来触发相应的操作。调用者将请求发送给命令对象,从而解耦了命令的发送者和接收者。

  2. 抽象命令(Command): 抽象命令是一个接口或抽象类,定义了命令的执行方法 execute()。它通常会声明一些可以用于存储命令执行所需参数的方法。抽象命令充当了命令对象的基类,为具体命令提供了统一的接口。

  3. 具体命令(Concrete Command): 具体命令是抽象命令的子类,实现了抽象命令中定义的方法。具体命令持有接收者对象,并将请求转发给接收者来执行具体操作。具体命令负责封装命令的参数和上下文信息,并通过调用接收者的方法来完成实际的业务逻辑。

  4. 接收者(Receiver): 接收者是执行实际业务逻辑的对象。它包含了具体的操作方法,负责执行命令所需的具体操作。接收者知道如何实施和执行一个请求。

  5. 客户端(Client): 客户端创建命令对象,并设置其接收者。客户端可以自由组合不同的命令和接收者,构建出适合需求的命令链。客户端还可以通过调用调用者的方法来触发命令的执行。

总体而言,命令模式中的关系可以概括为:客户端创建具体命令对象,并将其与接收者进行关联;调用者持有具体命令对象,通过调用命令的 execute() 方法来触发命令的执行;命令对象通过调用接收者的方法来完成实际的业务逻辑。这种方式将命令发送者与接收者解耦,提供了一种灵活且可扩展的设计方案。


🐱‍🚀四、注意事项

在使用命令模式时,需要注意以下几点:

  1. 合理划分命令: 在设计命令对象时,要根据实际需求合理划分命令。每个具体命令应该只包含一个操作,尽量保持命令的单一职责原则。

  2. 灵活配置命令链: 命令模式可以通过链式组合多个命令对象来实现复杂的操作。在客户端中,要灵活配置和组合命令对象,以满足具体需求。

  3. 支持撤销和恢复: 命令模式可以很容易地支持撤销和恢复操作。在设计命令对象时,可以提供 undo()redo() 等方法,使得命令可以反向执行以及重新执行。

  4. 命令的动态性: 命令模式支持动态地添加、替换和删除命令。可以按需求动态地创建具体命令对象,并将其注入到调用者中。

  5. 安全性考虑: 在使用命令模式时,要确保对命令的合法性进行验证。例如,检查参数是否有效,避免潜在的安全漏洞。

  6. 考虑性能问题: 如果系统中有大量的命令对象,可能会导致内存占用和性能问题。在设计和实现命令模式时,要注意对资源的合理管理,避免过度消耗内存或造成性能瓶颈。

  7. 与其他模式结合使用: 命令模式可以与其他设计模式结合使用,例如组合模式、工厂模式等。根据实际需求,选择合适的模式组合,以实现更复杂的系统功能。

综上所述,合理划分命令、灵活配置命令链、支持撤销和恢复、考虑安全性和性能问题,以及与其他模式结合使用,都是在使用命令模式时需要注意的事项。这些注意事项将有助于提高系统的可维护性、可扩展性和性能效率。


🎂五、使用场景

命令模式适用于以下场景:

  1. 需要将请求发送者和接收者解耦: 命令模式可以使请求的发送者与接收者之间解耦,让发送者不需要知道具体的接收者是谁以及如何执行操作。这样可以提高系统的灵活性和可扩展性。

  2. 需要支持撤销和恢复操作: 命令模式可以很容易地支持操作的撤销和恢复。通过保存命令对象的历史记录,可以实现撤销操作,并且可以重复执行已撤销的命令来实现恢复操作。

  3. 需要对操作进行参数化或延迟执行: 命令模式允许将操作进行参数化,即将操作及其参数封装在命令对象中,可以根据需要动态改变命令的参数。此外,命令模式还可以在需要时延迟执行命令。

  4. 需要支持事务操作: 命令模式可以将多个操作封装为一个命令对象,从而支持事务操作。在执行命令的过程中,可以保证一系列操作的原子性,要么全部成功执行,要么全部回滚。

  5. 需要实现日志和审计功能: 通过命令模式,可以在命令的执行前后记录日志信息、进行审计等操作。这样可以方便地跟踪命令的执行情况和进行错误调试。

  6. 需要实现命令的队列和调度: 命令模式可以将命令对象放入队列中,并按照一定的顺序逐个执行。这样可以实现命令的调度和异步执行,提高系统的响应性能。

总之,命令模式适用于需要解耦请求发送者和接收者、支持撤销和恢复操作、参数化和延迟执行操作、事务处理、日志记录和审计等功能的场景。它可以提供更加灵活和可扩展的设计方式,有助于降低系统的耦合度,并支持更好的代码组织和维护。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于命令模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

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

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

相关文章

java 代码块

文章目录 代码块的描述静态代码块静态代码块的特点 非静态代码块分析加载顺序 代码块的描述 代码块(或初始化块)的作用&#xff1a; 对Java类或对象进行初始化 代码块(或初始化块)的分类&#xff1a; 一个类中代码块若有修饰符&#xff0c;则只能被static修饰&#xff0c;称为…

嵌入式_一种非常简单实用的基于GD32的裸机程序框架

嵌入式_一种非常简单实用的基于GD32的裸机程序框架 搜索了一下关于GD或ST裸机程序的问题&#xff0c;网上有非常多也非常的例子&#xff0c;但是针对裸机开发的程序框架却比较少&#xff0c;这里简单整理了一下在项目中使用过的一种比较小巧便携的裸机程序框架&#xff08;确切…

cloud Alibab+nacos+gateway集成swaggerui,统一文档管理(注意点)

首先说明&#xff1a;本文只说整合注意点 效果图和功能参考链接 1.使用gateway访问nacos服务&#xff0c;503 在网关服务添加依赖即可解决 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign&…

1.入门matlab数理统计随机数的产生(matlab程序)

1.简述 一、常见分布的随机数的产生 随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数&#xff0c;比如在从统计总体中抽取有代表性的样本的时候。而matlab直接提供了产生随机数的通用函数&#xff0c;但针对不同的分布&#xff0c;函数形式会有所不同&#…

DITA技巧:将DITA或Markdown发布成CHM

- 1 - 场景 CHM是英文Compiled HTML Help的缩写&#xff0c;是微软公司专有的联机帮助格式&#xff0c;由HTML页面、索引和其他导航工具的集合组成。这些文件被压缩并部署为二进制格式&#xff0c;扩展名为.CHM&#xff0c;用于编译HTML。CHM格式通常用于软件文档。 虽然CHM…

16. 最接近的三数之和(双指针+减去多余步骤)

16. 最接近的三数之和 双指针减去多余步骤测试代码测试结果 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&…

JSP环境搭建教程(保姆级!!)

简介 Java Server Pages (JSP) 是一种由 Sun Microsystems 开发的用于创建动态网页的技术。它是 Java EE (Java Enterprise Edition) 技术的一部分&#xff0c;允许开发者在 HTML 中嵌入 Java 代码&#xff0c;从而实现动态内容的生成。 JSP 主要由两部分组成&#xff1a;静态…

LiveGBS流媒体平台GB/T28181功能-如何对接海康大华宇视等监控摄像头报警消息报警订阅国标报警信息

LiveGBS流媒体平台GB/T28181功能-如何对接海康大华宇视等监控摄像头报警消息报警订阅国标报警信息 1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅 1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3…

红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用

红外雨量计&#xff08;光学雨量传感器&#xff09;在预防地质灾害中怎样发挥作用 红外雨量计是一种利用红外线原理测量雨量的设备。在预防地质灾害中&#xff0c;红外雨量计可以发挥以下作用&#xff1a; 1.准确测量雨水的降雨量。地质灾害往往与雨水的降雨量密切相关&#x…

【Java EE】-JVM

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 雨下整夜 我的爱溢出就像雨水 ——《七里香》 主要内容&#xff1a;JDK&#xff0c;JRE&#xff0c;JVM三者之间的联系。JVM内存区域划分&#xff1a;本地方法栈…

物联网技术的智能配电室综合监控系统设计

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;配电室是电力系统的重要基础设施&#xff0c;可以保障供配电系统的安全稳定运行。但是&#xff0c;配电室数量多、部署分散、管理复杂&#xff0c;人工现场巡检管理方式费时费工、错误率高&#xff0c;如果发生故障隐…

智能工厂-亿发生产型企业信息化ERP管理系统,打造智能制造工业

对于制造业来说&#xff0c;生产就是发展的动力。传统制造工厂在生产管理中存在很多不足和缺点&#xff0c;流程管理混乱&#xff0c;生产状态不稳定。在制造工厂中实施机械生产工厂ERP管理系统可以解决生产管理中低效率问题&#xff0c;使得制造工厂向着更科学化、智能化的方向…

ETHERNET/IP转RS485/RS232网关profinet与Ethernet通讯卡

网络数据传输遇到的协议不同、数据互通麻烦等问题&#xff0c;一直困扰着大家。然而&#xff0c;现在有一种神器——远创智控YC-EIP-RS485/232&#xff0c;它将ETHERNET/IP网络和RS485/RS232总线连接在一起&#xff0c;让数据传输更加便捷高效。 那么&#xff0c;它是如何实现…

Jmeter接口关联(一)【使用json层级方式提取值】与python中使用层级方式提取值 完成接口关联

文章目录 前言一、按照 json 的路径来提取 ​​​​​​​&#xff08;1&#xff09;成功匹配到数据的案例&#xff08;按照层级匹配&#xff09;&#xff08;2&#xff09;失败未匹配到数据的案例&#xff08;没有按照层级匹配&#xff09;json提取器二、使用完整的接口关联&a…

地方废物回收机构管理系统

方废物回收机构管理系统的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该系统的开发&#xff0c;实现了地方废物回收机构的信息化&#xff0c;使用户体验到更优秀的地方废物回收机构管理&#xff0c;管理员管理操作将更加方便&…

奔赴猿田地,开垦一亩三分产

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 大家好&#xff0c;很久没开荒了&#xff0c;最近一直在想着要不要开始分享最近的一些小技术&#xff0c;看到互联网泡沫化日益严重&#xff0c;程序猿下岗失业&#xff0c;bibi皆是。但不管外界…

Linux如何设置固定IP

首先&#xff0c;Linux的默认网关和DNS解析都是一个地址。 IPV4 IP地址是32位2进制 前缀默认是24但是格式还是得写 DNS解析域名&#xff0c;类似Map&#xff0c;根据域名寻找IP DHCP 如果是自动设置IP&#xff0c;就是由他来自行分配&#xff0c;但是手动的话&#xff0c;就需…

软件测试-基础篇

一、接口的认识 什么是接口 电脑&#xff1a;USB&#xff0c;投影机&#xff08;数据传输&#xff09; 软件&#xff1a;API&#xff0c;application program interface.微信提现与充值&#xff0c;支付宝支付&#xff0c;银联支付接口。&#xff08;鉴权码&#xff1a;token…

港联证券|暑期亲子游和避暑游需求旺盛 数据要素产业价值有望加速释放

上周五&#xff0c;A股再度回调&#xff0c;沪指失守3200点&#xff0c;创业板指、科创50指数跌约1%。截至收盘&#xff0c;沪指跌0.28%报3196.61点&#xff0c;深成指跌0.73%报10888.55点&#xff0c;创业板指跌1.05%报2169.21点&#xff0c;科创50指数跌1.02%&#xff1b;两市…

Vue生态及实践 - Nuxt

Nuxt.js Nuxt.js - Vue.js 通用应用框架 | Nuxt.js 中文网 Nuxt.js 中文教程_w3cschool 开源社区仁人志士创建了开箱可用的&#xff1a;Nuxt.js框架&#xff0c;帮助我们更快的实现ssr的同构。 Nuxt.js是一个基于Vue.js的通用应用框架它是对客户端&#xff0c;服务端基础架…