23种设计模式-命令(Command)设计模式
命令设计模式
- 🚩什么是命令设计模式?
- 🚩命令设计模式的特点
- 🚩命令设计模式的结构
- 🚩命令设计模式的优缺点
- 🚩命令设计模式的Java实现
- 🚩代码总结
- 🚩总结
🚩什么是命令设计模式?
命令设计模式(Command Pattern) 是一种 行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
使用场景
-
将请求调用者和请求接收者解耦
-
支持命令的撤销(Undo)和恢复(Redo)操作
-
支持事务系统 或 将一组操作组合成一个复合命令
-
支持宏命令(命令队列) 或 将命令存入日志
🚩命令设计模式的特点
-
解耦调用者和接收者:调用者无需知道接收者的具体实现
-
可扩展性强:可以方便地添加新的命令
-
支持撤销和重做:可以记录命令历史实现撤销/重做功能
-
支持事务:可以将一组命令组合成一个事务
-
灵活性高:命令可以被排队、记录日志或延迟执行
🚩命令设计模式的结构
命令模式主要包含以下部分:
-
Command(命令接口):声明执行操作的接口
-
ConcreteCommand(具体命令):将一个接收者对象绑定于一个动作,实现执行方法
-
Invoker(调用者):要求命令对象执行请求
-
Receiver(接收者):知道如何实施与执行一个请求相关的操作
-
Client(客户端):创建具体命令对象并设置其接收者
🚩命令设计模式的优缺点
✅ 优点
-
降低系统耦合度:调用者和接收者之间没有直接引用
-
扩展性好:新增命令不会影响现有代码
-
支持撤销/重做:可以方便地实现命令的撤销和恢复
-
支持事务:可以将一组命令组合成一个复合命令
-
灵活性高:可以方便地实现命令队列和日志请求
❌ 缺点
-
可能产生过多具体命令类:每个操作都需要一个具体命令类
-
增加系统复杂度:引入了额外的抽象层
-
性能开销:命令对象的创建和执行可能带来额外的开销
🚩命令设计模式的Java实现
代码地址:GitHub
- 创建
Receiver(接收者)类
/*** @author hanson.huang* @version V1.0* @ClassName Tv* @Description 接收者 - 电视机* @date 2025/3/25 16:42**/
public class Tv {public void onAction() {System.out.println("电视机开机了...");}public void offAction() {System.out.println("电视机关机了...");}
}
- 创建
Command(命令接口)
/*** @author hanson.huang* @version V1.0* @InterfaceName Command* @Description 命令接口* @date 2025/3/25 16:39**/
public interface Command {// 命令接口public void Execute();// 执行命令
}
-
创建具体命令类
- 开机命令
/*** @author hanson.huang* @version V1.0* @ClassName OnCommand* @Description 开机命令* @date 2025/3/25 16:42**/ public class OnCommand implements Command {private Tv tv;public OnCommand(Tv tv) {this.tv = tv;}@Overridepublic void Execute() {tv.onAction();} }- 关机命令
/*** @author hanson.huang* @version V1.0* @ClassName OffCommand* @Description 关机命令* @date 2025/3/25 16:43**/ public class OffCommand implements Command {private Tv tv;public OffCommand(Tv tv) {this.tv = tv;}@Overridepublic void Execute() {tv.offAction();} } -
创建
Invoker(调用者)类
/*** @author hanson.huang* @version V1.0* @ClassName Invoker* @Description 请求者* @date 2025/3/25 16:40**/
public class Invoker { // 请求者private Command command;// 命令public void setCommand(Command command) { // 设置请求者 的 请求的命令this.command = command;}public void call() { // 调用command.Execute();}
}
- 测试命令模式
/*** @author hanson.huang* @version V1.0* @ClassName CommandPattern* @Description 测试命令模式* @date 2025/3/25 16:44**/
public class CommandPattern {public static void main(String[] args) {Tv tv = new Tv(); // 接收者对象 - 电视机Command onCommand = new OnCommand(tv); // 开机命令Command offCommand = new OffCommand(tv); // 关机命令Invoker invoker = new Invoker(); // 调用者invoker.setCommand(onCommand); // 设置开机命令invoker.call(); // 执行命令System.out.println("=======================");invoker.setCommand(offCommand); // 设置关机命令invoker.call(); // 执行命令}
}
📌 运行结果

🚩代码总结
-
Tv 作为接收者知道如何执行具体的操作
-
Command 接口定义了执行命令的统一方法
-
OnCommand 和 OffCommand 是具体命令类,绑定接收者和动作
-
Invoker 调用命令对象执行请求
-
CommandPattern 客户端创建命令对象并设置其接收者
🚩总结
-
命令设计模式 将请求封装为对象,使不同的请求、队列或日志成为可能
-
核心是 解耦请求发送者和接收者,使发送者无需知道接收者的具体实现
-
适用于 需要支持撤销/重做、事务、命令队列 等场景
✅ Java源码中的应用场景:
-
Swing/AWT中的事件处理:
-
java.awt.Action和javax.swing.Action -
按钮点击等事件处理
-
-
Java线程池:
-
java.lang.Runnable接口类似于命令接口 -
线程池执行命令对象
-
-
Servlet过滤器链:
javax.servlet.Filter接口定义命令模式
-
Spring框架:
-
org.springframework.core.command.Command接口 -
Spring Batch中的任务执行
-
-
JUnit测试框架:
- 测试用例的执行采用命令模式
-
数据库事务:
- 一组SQL命令组成事务执行
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关文章:
23种设计模式-命令(Command)设计模式
命令设计模式 🚩什么是命令设计模式?🚩命令设计模式的特点🚩命令设计模式的结构🚩命令设计模式的优缺点🚩命令设计模式的Java实现🚩代码总结🚩总结 🚩什么是命令设计模式…...
和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程
当前,医学与人工智能的深度融合正迎来历史性发展机遇。华中科技大学同济医学院附属同济医院(以下简称“同济医院”)作为医疗人工智能应用的先行探索者,已在电子病历辅助书写、科研数据分析、医疗合同自动化审核等关键场景完成试点…...
CI/CD(三) 安装nfs并指定k8s默认storageClass
一、NFS 服务端安装(主节点 10.60.0.20) 1. 安装 NFS 服务端 sudo apt update sudo apt install -y nfs-kernel-server 2. 创建共享目录并配置权限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允许匿名访问 sudo chmod 777 /dat…...
Centos 7 安装VNC服务
Centos 7 安装VNC服务 1. 安装 TigerVNC2. 设置 VNC 密码3. 创建并配置 x0vncserver 服务4. 启用并启动服务5. 检查服务状态6. 配置防火墙7. 连接 VNC问题1:出现无法安装可能是镜像源导致的。手动配置镜像源清除 YUM 缓存并重新加载 1. 安装 TigerVNC 确保已安装 TigerVNC 服务…...
使用 Go 构建 MCP Server
一个互联网技术玩家,一个爱聊技术的家伙。在工作和学习中不断思考,把这些思考总结出来,并分享,和大家一起交流进步。 一、MCP 介绍 1. 基本介绍 MCP(Model Context Protocol,模型上下文协议)是…...
C语言贪吃蛇实现
When the night gets dark,remember that the Sun is also a star. 当夜幕降临时,请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…...
pytorch小记(十五):pytorch中 交叉熵损失详解:为什么logits比targets多一个维度?
pytorch小记(十五):pytorch中 交叉熵损失详解:为什么logits比targets多一个维度? PyTorch交叉熵损失详解:为什么logits比targets多一个维度?一、前言:新手常见困惑二、核心概念&…...
利用zabbix自带key获取数据
获取数据的三种方法 1、链接模版 服务器系统自身的监控 CPU CPU使用率、CPU负载 内存 内存剩余量 硬盘 关键性硬盘的剩余量、IO 网卡 流量/IO(流入流量、流出流量、总流量、错误数据包流量) 进程数 用户数 2、利用zabbix自带的键值key 1)监…...
无人机数据处理系统设计要点与难点!
一、系统设计要点 无人机数据处理系统需要高效、可靠、低延迟地处理多源异构数据(如影像、传感器数据、位置信息等),同时支持实时分析和长期存储。以下是核心设计要点: 1.数据采集与预处理 多传感器融合:集成摄像头…...
最大异或对 The XOR Largest Pair
题目来自洛谷网站: 思路: 两个循环时间复杂度太高了,会超时。 我们可以先将读入的数字,插入到字典树中,从高位到低位。对每个数查询的时候,题目要求是最大的异或对,所以我们选择相反的路径&am…...
基于SpringBoot + Vue 的汽车租赁管理系统
技术介绍: ①:架构: B/S、MVC ②:系统环境:Windows/Mac ③:开发环境:IDEA、JDK1.8、Maven、Mysql ④:技术栈:Java、Mysql、SpringBoot、Mybatis、Vue 项目功能: 角色&am…...
基于DrissionPage的TB商品信息采集与可视化分析
一、项目背景 随着电子商务的快速发展,淘宝作为中国最大的电商平台之一,拥有海量的商品信息。这些数据对于市场分析、用户行为研究以及竞争情报收集具有重要意义。然而,由于淘宝的反爬虫机制和复杂的页面结构,直接获取商品信息并不容易。尤其是在电商行业高速发展的今天,商…...
电气、电子信息与通信工程的探索与应用
从传统定义来看,电气工程是现代科技领域的核心学科和关键学科。它涵盖了创造产生电气与电子系统的有关学科的总和。然而,随着科学技术的飞速发展,电气工程的概念已经远超出这一范畴。 电子信息工程则是将电子技术、通信技术、计算机技术等应…...
Python备赛笔记2
1.区间求和 题目描述 给定a1……an一共N个整数,有M次查询,每次需要查询区间【L,R】的和。 输入描述: 第一行包含两个数:N,M 第二行输入N个整数 接下来的M行,每行有两个整数,L R,中间用空格隔开&…...
HTML5 拖放(Drag and Drop)学习笔记
一、HTML5 拖放简介 HTML5 拖放(Drag and Drop)是HTML5标准的一部分,允许用户抓取一个对象并将其拖动到另一个位置。拖放功能在现代网页中非常常见,例如文件上传、任务管理、布局调整等场景。 HTML5 拖放功能支持以下浏览器&…...
Sass (Scss) 与 Less 的区别与选择
Sass 与 Less 的区别与选择 1. 语法差异2. 特性与支持3. 兼容性4. 选择建议 在前端开发中,CSS预处理器如Sass(Syntactically Awesome Stylesheets)和Less被广泛使用,它们通过引入变量、嵌套规则、混合、函数等特性,使C…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
记一次线上SQL死锁事故
一、 引言 SQL死锁是一个常见且复杂的并发控制问题。当多个事务在数据库中互相等待对方释放锁时,就会形成死锁,从而导致事务无法继续执行,影响系统的性能和可用性。死锁不仅会导致数据库操作的阻塞,增加延迟,还可能对…...
Java并发编程 什么是分布式锁 跟其他的锁有什么区别 底层原理 实战讲解
目录 一、分布式锁的定义与核心作用 二、分布式锁与普通锁的核心区别 三、分布式锁的底层原理与实现方式 1. 核心实现原理 2. 主流实现方案对比 3. 关键技术细节 四、典型问题与解决方案 五、总结 六、具体代码实现 一、分布式锁的定义与核心作用 分布式锁是一种在分布…...
【react】在react中async/await一般用来实现什么功能
目录 基本概念 工作原理 优点 注意事项 底层原理 实际应用场景 1. 数据获取 (API 请求) 2. 表单提交 3. 异步状态管理 4. 异步路由切换 5. 异步数据预加载 6. 第三方 API 调用 7. 文件上传/下载 8. 路由导航拦截 关键注意事项 基本概念 async 函数:用…...
Axure项目实战:智慧城市APP(六)市民互动(动态面板、显示与隐藏)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:市民互动 主要内容:动态面板、显示与隐藏交互应用 应用场景:AI产品交互、互动类应用 案例展示: 案例视频&am…...
为何服务器监听异常?
报错: 执行./RCF后出现监听异常--在切换网络后,由于前面没有退出./RCF执行状态;重新连接后,会出现服务器监听异常 原因如下: 由于刚开始登录内网,切换之后再重新登录内网,并且切换网络的过程中…...
1.认识Excel
一 Excel 可以用来做什么 二 提升技巧 1.数据太多 2.计算太累 3.提升数据的价值和意义 4.团队协作 三 学习目标 学习目标不是为了掌握所有的技能,追逐新功能。而是学知识来解决需求,如果之前的技能和新出的技能都可以解决问题,那不学新技能也…...
目标跟踪——deepsort算法详细阐述
deepsort 算法详解 Unmatched Tracks(未匹配的轨迹) 本质角色: 是已存在的轨迹在当前帧中“失联”的状态,即预测位置与检测结果不匹配。 生命周期阶段: 已初始化: 轨迹已存在多帧,可能携带历史信息(如外观特征、运动模型)。 未被观测到: 当前帧中未找到对应的检测框…...
AI Agent 是什么?从 Chatbot 到自动化 Agent(LangChain、AutoGPT、BabyAGI)
1. 引言:AI Agent 的演进 AI Agent(人工智能智能体)是 AI 发展的重要方向之一。早期的 AI 主要以 Chatbot 形式存在,如客服机器人、智能助手等,主要基于 NLP 技术进行任务处理。而随着大模型(LLM)能力的提升,AI Agent 逐步演进为能够自主执行任务的智能体,如 AutoGPT…...
ngx_http_core_root
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_root(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_loc_conf_t *clcf conf;ngx_str_t *value;ngx_int_t alias;ngx_uint_t …...
python康复日记-request库的使用,爬虫自动化测试
一,request的简单应用 #1请求地址 URLhttps://example.com/login #2参数表单 form_data {username: admin,password: secret } #3返回的响应对象response response requests.post(URL,dataform_data,timeout5 ) #4处理返回结果,这里直接打印返回网页的…...
光谱范围与颜色感知的关系
光谱范围与颜色感知是光学、生理学及技术应用交叉的核心课题,两者通过波长分布、人眼响应及技术处理共同决定人类对色彩的认知。以下是其关系的系统解析: 1.基础原理:光谱范围与可见光 光谱范围定义: 电磁波谱中能被特定…...
OpenCV vs MediaPipe:哪种方案更适合实时手势识别?
引言 手势识别是计算机视觉的重要应用,在人机交互(HCI)、增强现实(AR)、虚拟现实(VR)、智能家居控制、游戏等领域有广泛的应用。实现实时手势识别的技术方案主要有基于传统计算机视觉的方法&am…...
el-select下拉框,搜索时,若是匹配后的数据有且只有一条,则当失去焦点时,默认选中该条数据
1、使用指令 当所需功能只能通过直接的 DOM 操作来实现时,才应该使用自定义指令。可使用方法2封装成共用函数,但用指令他人复用时比较便捷。 <el-tablev-loading"tableLoading"border:data"tableList"default-expand-allrow-key…...
