23种设计模式之命令模式(Command Pattern)

news/2024/5/10 13:47:25/文章来源:https://blog.csdn.net/qq_53847859/article/details/130883957

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的命令模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 命令模式概念
  • 命令模式角色
  • 命令模式注意事项
  • 命令模式案例
  • 命令模式小结

命令模式概念

命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成一个对象,从而使不同的请求可以被异步、延迟、排队,或者记录下来以备撤销或重做等操作。命令模式可以将客户端和接收者解耦,提高系统的灵活性与可扩展性。

命令模式角色

命令模式包含如下几个主要角色:

命令(Command):定义了执行操作的接口,包含了执行该命令所需的所有必要信息。

具体命令(Concrete Command):实现了命令接口,它包含了一个接收者对象,并完成具体的命令操作。

接收者(Receiver):执行命令的对象,真正的命令执行者。

调用者(Invoker):发出命令并要求执行命令的对象,通常会持有命令对象,并通过命令对象来执行具体的操作。

客户端(Client):创建具体的命令对象,并将其设置到调用者中,然后发起调用者的请求。

命令模式注意事项

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

尽量将每个命令实现为一个独立的类,这样可以方便地扩展新的命令类型。

命令对象可以被序列化,并且命令队列支持保存和恢复操作,从而可以实现日志记录、撤销和重做等功能。

可以使用组合模式将命令组合成宏命令,从而可以批量执行多个命令。

在有些场景下,可以使用命令模式来代替回调函数(callback),从而避免回调函数带来的复杂度和耦合性。

命令模式案例

接下来通过一个案例来学习命令模式,此案例展示了如何使用命令模式将请求封装成对象,并实现撤销操作:

// 定义命令接口
interface Command {void execute();void undo();
}// 实现具体命令对象
class LightOnCommand implements Command {private final Light light;private boolean lastState;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {lastState = light.isOn();light.turnOn();}@Overridepublic void undo() {if (lastState) {light.turnOn();} else {light.turnOff();}}
}// 实现接收者对象
class Light {private boolean isOn = false;public boolean isOn() {return isOn;}public void turnOn() {isOn = true;System.out.println("Light is on");}public void turnOff() {isOn = false;System.out.println("Light is off");}
}// 实现调用者对象
class RemoteControl {private final Command command;public RemoteControl(Command command) {this.command = command;}public void pressButton() {command.execute();}public void pressUndo() {command.undo();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建接收者对象Light light = new Light();// 创建具体命令对象LightOnCommand onCommand = new LightOnCommand(light);// 创建调用者对象,并设置命令对象RemoteControl remoteControl = new RemoteControl(onCommand);// 发起请求remoteControl.pressButton();// 撤销请求remoteControl.pressUndo();}
}

在上面的示例代码中,我们使用命令模式将打开电灯的操作封装成了一个命令对象 LightOnCommand,并通过调用者对象 RemoteControl 来发起请求。客户端可以根据需要创建不同的命令对象,并将其设置到调用者对象中,然后通过调用调用者对象的方法来执行具体的命令操作。

命令模式还支持命令队列、宏命令和日志记录等高级特性,可以根据具体的场景选择适合的方式来使用命令模式。

命令模式小结

命令模式(Command Pattern)是一种优秀的行为型设计模式,它将一个请求封装成一个对象,从而使得请求发起者与请求接收者解耦,并可支持撤销、重做等功能。通过使用命令模式,可以极大地提高代码复用性、灵活性和可扩展性。

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)

【学习难度:★★★★☆,使用频率:★★★★★】 3.1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中…

OJ练习第116题——二进制矩阵中的最短路径(BFS)

二进制矩阵中的最短路径 力扣链接:1091. 二进制矩阵中的最短路径 题目描述 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格&am…

ORB-LSAM2:ComputeKeyPointsOctTree()提取特征:maxY = iniY + hCell + 6 为怎么是+6而不是+3?

如标题所示&#xff0c;本博客主要讲述 void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint>> &allKeypoints){}函数中maxY iniY hCell 6 为怎么是6而不是3&#xff1f; 为了连续性&#xff0c;会介绍一下ComputeKeyPointsOctTree函数&a…

PMP课堂模拟题目及解析(第13期)

121. 项目经理、团队成员以及若干干系人共同参与一次风险研讨会。已经根据风险管理计划生成并提供一份风险报告。若要为各个项目风险进行优先级排序&#xff0c;现在必须执行哪一项分析&#xff1f; A. 定量风险分析 B. 根本原因分析 C. 偏差分析 D. 定性风险分析 122. …

软件系统三基座之一:权限管理

软件系统三基座包含&#xff1a;权限管理、组织架构、用户管理。 何为基座&#xff0c;即是有了这些基础&#xff0c;任一相关的“建筑”就能逐步搭建起来。 万丈高楼平地起 一、为什么要权限管理 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;…

报表控件FastReport使用指南-在Ubuntu LTS中创建PDF文档

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…

jvm之JMX

写在前面 本文来看先jmx相关内容。 1&#xff1a;jmx介绍 jvm在运行的过程中有很多的信息&#xff0c;比如堆内存&#xff0c;线程数&#xff0c;加载的类信息&#xff0c;CPU的使用量等&#xff0c;如果我们想要将这些信息暴漏让外界获取&#xff0c;该怎么做呢?此时就需要…

池州控股集团财务共享项目启动啦!

近日&#xff0c;由用友网络承建的池州市投资控股集团有限公司财务共享项目启动会成功举办&#xff0c;也标志着池州控股集团财务共享项目正式启动&#xff01;池州控股集团总经理刘俊、用友国资事业部总经理汪发清及其他相关专家和项目组主要成员参加了此次启动会。 池州投控集…

档案馆空气质量在线3D监控系统温湿度方案

档案馆库房八防温湿度空气质量一体化解决方案 档案库房是档案事业发展的基石&#xff0c;其主要任务是集中保管国家机构及个人等在各种形式下形成的具有一定价值和保存价值的各种载体档案&#xff0c;主要包括文书档案、科技档案、会计档案、人事档案、实物档案等。随着我国经济…

Node版本管理器nvm的安装与使用

前言&#xff1a; 多项目新旧项目管理的时候&#xff0c;往往与依赖不同的node版本&#xff0c;不同的版本对其他依赖的安装有一定的影响&#xff0c;因此我们需要对node的版本进行方便快捷管理和切换&#xff0c;如果直接卸载重装对应版本&#xff0c;切换项目再次卸载重装明显…

【泛微ecology_oracle】如何把查询到的单列人力资源id合并成多人力资源格式

如何把查询到的单列人力资源id合并成多人力资源格式 在泛微ecology中&#xff0c;单列人力资源id合并成多人力资源的使用场景在泛微ecology中&#xff0c;在数据库里人员姓名存储形式那如何实现人力资源字段合并多人力资源字段呢&#xff1f; 在泛微ecology中&#xff0c;单列人…

Rancher添加集群报错:Etcd Cluster is not healthy

原因&#xff1a; 有一台虚拟机在升级内核失败后&#xff0c;回滚至快照。但由于快照版本太老旧&#xff0c;和当前的rancher版本不匹配&#xff0c;服务器上的agent等需要清楚后&#xff0c;重新在rancher添加集群&#xff1b;但是只删除了rancher镜像以及agent相关容器&#…

开源开放 生态共建 | openKylin社区单位会员突破200家!

当前&#xff0c;开放、协作、共享的开源模式已成为全球软件技术和产业创新的主导&#xff0c;也为信息技术国产自主化提供了强大助力。openKylin作为中国桌面操作系统开源社区&#xff0c;以聚焦桌面操作系统根技术为核心、以孵化相关领域关键项目为目标、以布道开源文化为抓手…

关闭linux kernel内核的启动log在控制台的输出

要关闭Linux内核的启动日志&#xff0c;你可以通过以下方法之一进行操作&#xff1a; 1. 通过引导加载器配置&#xff1a; 打开引导加载器的配置文件&#xff0c;如GRUB的配置文件 /boot/grub/grub.cfg。 在内核的启动行&#xff08;以 “linux” 或 “kernel” 开头&#xf…

[论文评析]C-Mixup: Improving Generalization in Regression, NeurIPS,2022

C-Mixup: Improving Generalization in Regression 前言C-MixupReferences 前言 Mixup方法是针对分类任务的, 这篇方法相当于时提出了regression版本的Mixup, 实验证实能够大幅提升在regression task上的泛化能力. C-Mixup 是否可以把Mixup直接用于Regression task呢? 在原…

这可能是最全面的Java学习路线了

大家好&#xff0c;我是大彬~ 我本科学的不是计算机&#xff0c;大四开始自学Java&#xff0c;并且拿到了几个互联网中大厂的offer。在学习Java这方面还是比较有经验的&#xff0c;下面我来分享下我整理的Java自学路线。 在这里也提醒学弟学妹们&#xff0c;要尽早确定以后的…

数字档案馆建设指南

数字档案馆建设指南 目 录 1.总体要求 2.管理系统功能要求 3.应用系统开发和服务平台构建 4.数字档案资源建设 5.保障体系建设 1.总体要求 1.1概述 数字档案馆是指各级各类档案馆为适应信息社会日益增长的对档案信息资源管理、利用需求&#xff0c;运用现代信息技术对数字…

【问题记录】postgreSQL使用默认密码导致kdevtmpfsi挖矿病毒注入

起因 postgreSQL我做错了这几件事情 开启了全部IP登陆权限postgreSQL用的是默认用户名和密码用户postgres也没有设置密码&#xff0c;直接用su - postgres就能登陆 不知道是什么原理&#xff0c;反正服务器被侵入&#xff0c;并且注入了病毒文件 1. 基本信息排查 linux服务器…

Kafka实时数据即席查询应用与实践

作者&#xff1a;vivo 互联网搜索团队- Deng Jie Kafka中的实时数据是以Topic的概念进行分类存储&#xff0c;而Topic的数据是有一定时效性的&#xff0c;比如保存24小时、36小时、48小时等。而在定位一些实时数据的Case时&#xff0c;如果没有对实时数据进行历史归档&#xff…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

Vue3 的父子组件传值、绑定表单数据、UI库的二次封装、防抖等&#xff0c;想来大家都很熟悉了&#xff0c;本篇介绍一种使用 Typescript 的方式进行统一的封装的方法。 基础使用方法 Vue3对于表单的绑定提供了一种简单的方式&#xff1a;v-model。对于使用者来说非常方便&…