探索设计模式:命令模式

探索设计模式:命令模式

    • 🧐1. 概念
    • 🎯2. 作用
    • 📦3. 实现
      • 3.1 定义命令接口
      • 3.2 实现具体命令
      • 3.3 实现接收者
      • 3.4 实现调用者
      • 3.5 使用
    • 💻4. 应用场景

在这里插入图片描述

  命令模式Command Pattern)就是一种行为型设计模式。其核心思想是将请求封装成一个对象,从而使你可以使用不同的请求、队列或者请求日志参数化其他对象,同时支持可撤销的操作。通过命令模式,可以将请求的发起者和接收者完全解耦,提高系统的灵活性和可扩展性。

🧐1. 概念


  想象一下,当你在家里使用遥控器控制电视时,你按下遥控器上的“电源”按钮,电视就会开启或关闭。在这个过程中,遥控器(调用者)并不知道电视(接收者)是如何工作的,它只是发送了一个“打开”或“关闭”的请求。命令模式正是基于这样的思路,将请求本身封装成一个对象,这样可以更容易地管理和执行请求。

命令模式通常包含四个关键角色:

  1. 命令Command):这是一个抽象类或接口,定义了执行操作的标准方法。所有的具体命令类都实现了这个接口,确保它们可以以统一的方式被调用。
  2. 具体命令Concrete Command):这是命令接口的具体实现,包含了执行操作的具体逻辑。每个具体命令类都关联了一个接收者对象,并且知道如何调用接收者的某个方法来完成任务。
  3. 接收者Receiver):接收者是真正执行命令的对象。它包含了具体的业务逻辑,当一个命令被执行时,实际上是调用了接收者的一个或多个方法。
  4. 调用者Invoker):调用者负责触发命令的执行。它可以持有一个或多个命令对象,并在适当的时候调用命令的执行方法。调用者不需要知道命令的具体实现细节,只需要知道如何调用即可。

🎯2. 作用


  1. 解耦:命令模式最大的优势在于它能够彻底解耦命令的发起者和接收者,使两者之间的依赖关系降到最低。这意味着可以在不改变原有代码的情况下,轻松地引入新的命令类型或修改现有命令的行为。
  2. 扩展性:由于命令对象实现了统一的接口,因此可以很容易地添加新的命令类,而不会影响到现有的系统接口。此外,命令模式还支持组合命令,即一个命令可以包含多个子命令,形成更复杂的操作序列。

📦3. 实现


  假设我们要开方法一个简单的智能家居控制系统,用户可以通过遥控器(调用者)控制家中的各种电器设备(接收者),如灯光、电视等。

我们可以通过命令模式来实现这一功能。

3.1 定义命令接口


public interface Command {void execute();
}

3.2 实现具体命令


public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}}

3.3 实现接收者


public class Light {public void turnOn(){System.out.println("Light is on");}public void turnOff(){System.out.println("Light is off");}}

3.4 实现调用者


public class RemoteControl {private Command command;public void setCommand(Command command){this.command = command;}public void pressButton(){command.execute();}}

3.5 使用


public class CommandClient {public static void main(String[] args) {Light light = new Light();// 遥控器对象RemoteControl remoteControl = new RemoteControl();// 具体命令对象LightOnCommand lightOnCommand = new LightOnCommand(light);LightOffCommand lightOffCommand = new LightOffCommand(light);// 为遥控器设置命令remoteControl.setCommand(lightOnCommand);// remoteControl.setCommand(lightOffCommand);// 按下遥控器按钮remoteControl.pressButton();}}

💻4. 应用场景


  1. 用户界面操作:在图形用户界面中,命令模式常用于处理各种用户输入事件,如按钮点击、菜单选择等。通过将这些操作封装成命令对象,界面组件可以独立于具体的业务逻辑,提高了代码的可复用性和可测试性。
  2. 事务管理:在需要支持事务回滚的系统中,命令模式可以帮助实现复杂的撤销/重做功能。每个命令不仅包含执行操作的方法,还可以包含撤销操作的方法,从而在必要时恢复到之前的状态。
  3. 队列处理:当系统需要处理大量异步请求时,可以使用命令模式将请求封装成命令对象并放入队列中等待处理。这中做法有助于平滑负载,避免资源争用。
  4. 日志记录:对于需要记录操作历史以便后续审计或分析的系统,命令模式提供了一种自然的方式来保存命令对象,方便日后查询和恢复。

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

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

相关文章

Python-创建并调用自定义文件中的模块/函数

背景:在Python编程中,我们常常需要创建自己的专属文件,以便帮助我们更高效,快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件,通常是指调用自己编写的Python模块…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)没几天,又来一个新的,真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)https://blog.csdn.ne…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文,作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法,包括两个关键阶段,一个是BIQA,基于vision-language…

CDN加速实战:使用七牛云CDN加速阿里云OSS资源访问

今天是双11搞活动,在阿里云1元注册了个域名,想着在学CDN,想使用CDN做个加速项目,但是阿里的要收费,上网查了下七牛云的不收费,想着将七牛云的CDN结合阿里的DNS做个访问加速,刚好看到了阿里的一个文章,照着改了改,实践成功了。 阿里文章:使用CDN加速OSS资源访问_对象…

MacBook 如何设置打开json格式文件的默认程序是vs code

首先右键选中文件,然后选中显示简介 然后选中打开方式 设置成vs code

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解

文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …

git 删除远程不存在本地命令却能看到的分支

要删除远程不存在但本地却能看到的分支&#xff0c;你可以按照以下步骤操作&#xff1a; 删除本地分支&#xff1a; 如果你确定要删除的分支已经没有用处&#xff0c;可以使用以下命令来删除本地分支&#xff1a; git branch -d <branch-name>这里的 <branch-name>…

【Oracle APEX开发小技巧10】CSS样式控制交互式报表列宽和自动换行效果

在实际开发中使用交互式报表可能会出现某些字段的列宽过长&#xff0c;某些字段的列宽只有缩到一角的情况&#xff0c;那么如何解决这种情况呢&#xff1f;有没有方法可以控制交互式报表的列宽呢&#xff1f;下面就来介绍一下解决方法&#xff1a; 页设置-页-CSS-内嵌 输入如下…

Linux内核、线程、进程同步互斥方法及IPC方法的总结

前段实践在B站进行模拟面试时发现&#xff0c; 模拟面试第四期-已经拿到大厂OFFER的研究生大佬-LINUX卷到飞起 自己对Linux中的同步互斥方法&#xff0c;以及IPC方法&#xff0c;没有很好的理解和总结过。因此&#xff0c;本笔记将总结这部分内容。 内核线程进程机制原子操作、…

Automated Isotope Identification Algorithm UsingArtificial Neural Networks-论文阅读

Automated Isotope Identification Algorithm Using Artificial Neural Networks 使用人工神经网络的自动同位素识别算法 M.Kamuda, J. Stinnett, and C.J. Sullivan 摘要 需要开发一种算法,以确定包含多种放射性同位素混合物的大量低分辨率伽马射线光谱数据集中放射性同位素…

MybatisPlus - 核心功能

文章目录 1.MybatisPlus实现基本的CRUD快速开始常见注解常见配置 2.使用条件构建造器构建查询和更新语句条件构造器自定义SQLService接口 官网 MybatisPlus无侵入和方便快捷. MybatisPlus不仅仅可以简化单表操作&#xff0c;而且还对Mybatis的功能有很多的增强。可以让我们的开…

数据结构:并查集

并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个 单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类…

ChatGPT新体验:AI搜索功能与订阅支付指南

就在凌晨&#xff0c;在ChatGPT迎来两周岁生日之际&#xff0c;OpenAI重磅发布了ChatGPT的全新人工智能搜索体验。 期待已久的时刻终于到来&#xff0c; ChatGPT正式转型成为一款革命性的AI搜索引擎! 先来看看ChatGPT搜索&#xff1a;这次不是简单的加个搜索框&#xff0c;而…

JS | 如何更好地优化 JavaScript 的内存回收?

目录 一、理解JavaScript内存生命周期 ● 创建对象和分配内存 ● 内存的使用 ● 内存回收 二、减少内存泄露 ● 避免全局变量 ● 正确使用闭包 三、合理管理内存 ● 局部变量和即时函数 ● 解绑事件监听器 四、使用现代JavaScript特性辅助内存回收 ● 使用WeakMap和…

群控系统服务端开发模式-应用开发-上传配置功能开发

下面直接进入上传配置功能开发&#xff0c;废话不多说。 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_upload (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,upload_type tinyint(1) UNSIGNED NOT NULL COMMENT 上传类型 1&#xff1a;本站 2&a…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…

从气象中心采集cma台风路径数据

在自然灾害监测与预警领域&#xff0c;台风作为一种极具破坏力的自然现象&#xff0c;其路径预测和强度评估对于减少潜在损失至关重要。随着互联网技术的发展&#xff0c;国家气象中心等专业机构提供了详尽的台风历史数据和实时跟踪服务&#xff0c;通过网络接口可便捷地访问这…

ssm+vue665基于Java的壁纸网站设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

Applied Artificial Intelligence

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿&#xff1a;由艾思科蓝支持在线投稿&#xff0c;请将文章全文投稿至艾思科蓝投稿…

oracle-函数-NULLIF (expr1, expr2)的妙用

【语法】NULLIF (expr1, expr2) 【功能】expr1和expr2相等返回NULL&#xff0c;不相等返回expr1经典的使用场景&#xff1a; 1. 数据清洗与转换 在数据清洗过程中&#xff0c;NULLIF 函数可以用于将某些特定值&#xff08;通常是无效或不需要的值&#xff09;替换为 NULL&…