当前位置: 首页 > article >正文

(十 五)趣学设计模式 之 命令模式!

在这里插入图片描述

目录

    • 一、 啥是命令模式?
    • 二、 为什么要用命令模式?
    • 三、 策略模式的实现方式
    • 四、 命令模式的优缺点
    • 五、 命令模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解策略模式请看: (十 四)趣学设计模式 之 策略模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的命令模式

一、 啥是命令模式?

想象一下,你正在使用遥控器 🕹️ 控制电视机 📺。 你可以按下不同的按钮来执行不同的操作:开机、关机、换台、调节音量等等。 遥控器本身并不执行这些操作,而是将这些操作封装成一个个命令,然后发送给电视机去执行。

命令模式,就是用来解决请求发送者和接收者之间耦合的问题! 它可以将请求封装成一个对象,从而解耦发送者和接收者,并支持命令的排队、撤销和重做 🎁。

简单来说,就是把请求封装成对象,让发送者和接收者互不干扰!

  • 你需要将请求的发送者和接收者解耦: 就像你需要让遥控器和电视机互不干扰 🕹️📺!
  • 你需要支持命令的排队、撤销和重做: 就像你需要支持遥控器的撤销和重做功能 ⏪⏩!
  • 你需要将多个操作组合成一个宏命令: 就像你需要将多个操作组合成一个一键换台功能 🔢!

二、 为什么要用命令模式?

用命令模式,好处多多 👍:

  • 解耦发送者和接收者: 发送者不需要知道接收者的具体实现,只需要知道如何发送命令 🤝!
  • 支持命令的排队、撤销和重做: 可以将命令存储起来,方便后续的撤销和重做 ⏪⏩!
  • 支持宏命令: 可以将多个命令组合成一个宏命令,一次性执行多个操作 🔢!
  • 提高代码的灵活性: 可以动态地添加和删除命令,使得代码更加灵活 🤸!

三、 策略模式的实现方式

命令模式主要包含四个核心概念:

  • 命令接口(Command): 定义了命令的接口,声明了所有命令都需要实现的方法 🤝!
  • 具体命令类(ConcreteCommand): 实现了命令接口,封装了具体的请求 ⚙️!
  • 调用者(Invoker): 持有命令接口的引用,负责在合适的时候调用命令 🕹️!
  • 接收者(Receiver): 负责执行具体的请求 📺!
// 命令接口:命令
public interface Command {void execute(); // 执行命令void undo(); // 撤销命令
}// 具体命令类:开机命令
public class OnCommand implements Command {private TV tv; // 电视机public OnCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.on(); // 执行开机操作}@Overridepublic void undo() {tv.off(); // 撤销开机操作}
}// 具体命令类:关机命令
public class OffCommand implements Command {private TV tv; // 电视机public OffCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.off(); // 执行关机操作}@Overridepublic void undo() {tv.on(); // 撤销关机操作}
}// 接收者:电视机
public class TV {public void on() {System.out.println("电视机开机了");}public void off() {System.out.println("电视机关机了");}public void changeChannel(int channel) {System.out.println("电视机切换到 " + channel + " 频道");}
}// 调用者:遥控器
public class RemoteControl {private Command onCommand; // 开机命令private Command offCommand; // 关机命令public RemoteControl(Command onCommand, Command offCommand) {this.onCommand = onCommand;this.offCommand = offCommand;}public void pressOnButton() {onCommand.execute(); // 执行开机命令}public void pressOffButton() {offCommand.execute(); // 执行关机命令}public void pressUndoButton() {offCommand.undo(); // 撤销上一个命令}
}// 客户端
public class Client {public static void main(String[] args) {// 创建电视机TV tv = new TV();// 创建命令Command onCommand = new OnCommand(tv);Command offCommand = new OffCommand(tv);// 创建遥控器RemoteControl remoteControl = new RemoteControl(onCommand, offCommand);// 按下开机按钮remoteControl.pressOnButton(); // 执行开机命令// 按下关机按钮remoteControl.pressOffButton(); // 执行关机命令// 按下撤销按钮remoteControl.pressUndoButton(); // 撤销关机命令}
}

代码解释

  • Command 接口定义了命令的接口,声明了 executeundo 方法。
  • OnCommand 类和 OffCommand 类实现了 Command 接口,封装了开机和关机的请求。
  • TV 类是接收者,负责执行开机和关机的操作。
  • RemoteControl 类是调用者,它持有 Command 接口的引用,负责在合适的时候调用命令。
  • 客户端通过 RemoteControl 类发送命令,并调用 execute 方法执行命令。

输出结果

电视机开机了
电视机关机了
电视机开机了

四、 命令模式的优缺点

优点:

  • 解耦发送者和接收者 🤝!
  • 支持命令的排队、撤销和重做 ⏪⏩!
  • 支持宏命令 🔢!
  • 提高代码的灵活性 🤸!

缺点:

  • 增加了类的数量 😫!
  • 代码复杂度增加 🤯!

五、 命令模式的应用场景

  • GUI 应用程序: 菜单、按钮、工具栏等等 🖱️!
  • 数据库事务: 事务的提交、回滚等等 💱!
  • 游戏开发: 游戏角色的动作、技能等等 🎮!
  • 日志记录: 记录用户的操作 📝!

六、 总结

  • 命令模式就像遥控器在手,天下我有! 🕹️
  • 核心概念包括命令接口、具体命令类、调用者和接收者! 🔑
  • 优点是解耦发送者和接收者、支持命令的排队、撤销和重做、支持宏命令、提高代码的灵活性! 👍
  • 缺点是增加了类的数量、代码复杂度增加! 👎
  • 适用于需要解耦请求发送者和接收者,或者需要支持命令的排队、撤销和重做的场景! 🎯

希望这篇文章能让你彻底理解命令模式! 💯 祝你学习愉快! 😄
看完请看:(十 六)趣学设计模式 之 责任链模式!

相关文章:

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…...

React低代码项目:问卷编辑器 I

问卷编辑器 Date: February 20, 2025 4:17 PM (GMT8) 目标 完成问卷编辑器的设计和开发完成复杂系统的 UI 组件拆分完成复杂系统的数据结构设计 内容 需求分析技术方案设计开发 注意事项: 需求指导设计,设计指导开发。前两步很重要页面复杂的话&…...

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展,信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切,数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范,针对于涉及重要秘密信息,需做到安全的物…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中,不管是市场研究还是科学分析,经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件,这种方式不便之处是不方便跟动态文字段落结合在一起,也不方便分…...

uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互

全篇大概 3600 字(含代码),建议阅读时间 25min 📚 目录 使用uni.request发起请求封装全局请求工具破解跨域难题总结 在跨平台应用开发中,网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求,但…...

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...

力扣27.移除元素(双指针)

题目看起来很乱&#xff0c;实际上意思是&#xff1a;把数组中值不等于val的元素放在下标为0,1,2,3......&#xff0c;并且返回数组中值不等于val的元素的个数 方法一&#xff1a;直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…...

VADv2: 基于矢量表征和概率规划的E2E架构

1. 写在前面 今天分享一篇自动驾驶领域的论文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率规划的E2E架构,2024年2月份华中科技大和地平线合作的一篇文章, 在经典的端到端模型架构上作出了基于概率规划去输出规划轨迹的…...

机器学习:强化学习的epsilon贪心算法

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;旨在通过与环境交互&#xff0c;使智能体&#xff08;Agent&#xff09;学习如何采取最优行动&#xff0c;以最大化某种累积奖励。它与监督学习和无监督学习不同&#xff0c;强调试错…...

授权与认证之jwt(一)创建Jwt工具类

JWT的Token要经过加密才能返回给客户端&#xff0c;包括客户端上传的Tokn,后端项目需要验证核 实。于是我们需要一个WT工具类&#xff0c;用来加密Token和验证Token的有效性。 一、导入依赖 <dependency><groupId>com.auth0</groupId><artifactId>jav…...

计算机毕业设计SpringBoot+Vue.js基于JAVA语言的在线考试与学习交流网页平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Difyにboto3を変更したカスタムDockerイメージの構築手順

Difyにboto3を変更したカスタムDockerイメージの構築手順 はじめに1. Dockerfileの作成2. Dockerイメージのビルド3. docker-compose.yamlの更新変更点&#xff1a; 4. コンテナの再起動注意事項まとめ はじめに DifyのDockerイメージに特定バージョンのboto3を変更する手順を…...

uniapp 中引入使用uView UI

文章目录 一、前言&#xff1a;选择 uView UI的原因二、完整引入步骤1. 安装 uView UI2. 配置全局样式变量&#xff08;关键&#xff01;&#xff09;3. 在 pages.json中添加&#xff1a;4. 全局注册组件5. 直接使用组件 五、自定义主题色&#xff08;秒换皮肤&#xff09; 一、…...

数据图表ScottPlot.WPF用法示例

目录 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 三、MainWindow.xaml.cs 具体使用代码 图表示例&#xff1a; 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 <Window x:Class"…...

js加密之延伸requestAnimationFrame

简言 上篇文章有提到requestAnimationFrame,只是随笔带过。这篇文章就着重研究一下requestAnimationFrame的运用&#xff0c;以及实际作用。还有关于在js加密技术中的落地实现可行性。 功能说明 小声说一下,做开发的同学一定要学会翻官方文档,我这里直接引用一段官方介绍。 …...

系统架构设计师—计算机基础篇—存储管理

文章目录 基本概念地址重定位 存储管理方案分区存储管理分页存储管理做题的方法地址重定位淘汰页号 分段存储管理段页式存储管理虚拟存储管理 基本概念 地址重定位 地址重定位是指将程序中的虚拟地址&#xff08;逻辑地址&#xff09;变换称内存的真实地址&#xff08;物理地…...

【第二十五周】:DeepPose:通过深度神经网络实现人体姿态估计

DeepPose 摘要Abstract文章信息引言DeepPose归一化网络结构初始网络&#xff08;粗略估计所有关节点位置&#xff09;精细化级联网络&#xff08;分别修正每个关节点的位置&#xff09; 疑问与解决代码实践总结 摘要 这篇博客介绍了DeepPose&#xff0c;这是首个基于深度神经网…...

SVN 简介

SVN 简介 引言 版本控制系统(Version Control System,VCS)是软件开发过程中不可或缺的工具之一。它能够帮助开发者管理代码的版本,追踪代码变更,协同工作,以及确保代码的稳定性和安全性。Subversion(简称SVN)是一种流行的版本控制系统,本文将为您详细介绍SVN的基本概…...

ARM Linux LCD上实时预览摄像头画面

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…...

基于DeepSeek 的图生文最新算法 VLM-R1

目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...

《论软件测试中缺陷管理及其应用》审题技巧 - 系统架构设计师

论软件测试中缺陷管理及其应用写作框架 一、考点概述 本论题“论软件测试中缺陷管理及其应用”主要考查的是软件测试领域中的缺陷管理相关知识与实践应用。论题涵盖了以下几个核心内容: 首先,需要理解软件缺陷的基本概念,即软件中存在的破坏正常运行能力的问题、错误或隐…...

MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私

苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境&#xff08;runtime&#xff09;&#xff0c;旨在简化在本地部署和使用大语言模型&#xff08;LLM&#xff09;的过程。它由 Vicarious 公司开发&#xff…...

python爬虫:pyspider的详细使用

文章目录 一、pyspider介绍1.1 核心概念1.2 与其他爬虫框架的比较二、 安装 pyspider三、编写爬虫脚本四、运行和监控爬虫4.1 启动爬虫4.2 监控任务状态4.3 任务管理五、高级功能5.1 分布式爬取5.2 JavaScript 渲染5.3 数据存储5.4 定时任务5.5 错误处理和重试机制六、示例:采…...

3-5 WPS JS宏 工作表的移动与复制学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...

删除变慢问题

问题&#xff1a; 有一个场景&#xff0c;每天都会删除数据&#xff0c;SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 &#xff0c;一直循环执行&#xff0c;当执行到最后一次满足条件的时候&#xff0c;就会很慢 原理分析 索引与…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...

游戏引擎学习第131天

仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化&#xff0c;特别是针对渲染和多线程的部分。目前&#xff0c;我们的目标是让地面块在独立线程上进行渲染&#xff0c;以提高性能。在此过程中&#xff0c;我…...

人大金仓国产数据库与PostgreSQL

一、简介 在前面项目中&#xff0c;我们使用若依前后端分离整合人大金仓&#xff0c;在后续开发过程中&#xff0c;我们经常因为各种”不适配“问题&#xff0c;但可以感觉得到大部分问题&#xff0c;将人大金仓视为postgreSQL就能去解决大部分问题。据了解&#xff0c;Kingba…...

《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》

--- ## 前言&#xff1a;为什么传统学习法正在杀死你的竞争力&#xff1f; 在新能源汽车领域&#xff0c;我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时&#xff0c;固态电池已进入量产倒计时&#xff1b;当自动驾驶还在L2级徘…...