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

在这里插入图片描述

目录

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

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解策略模式请看: (十 四)趣学设计模式 之 策略模式!
✨更多请看个人主页: 码熔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 应用程序: 菜单、按钮、工具栏等等 🖱️!
  • 数据库事务: 事务的提交、回滚等等 💱!
  • 游戏开发: 游戏角色的动作、技能等等 🎮!
  • 日志记录: 记录用户的操作 📝!

六、 总结

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

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

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

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

相关文章

Matlab 大量接单

分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB:熟练掌握MATLAB编程语言,能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…

【自学笔记】大数据基础知识点总览-持续更新

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 大数据基础知识点总览1. 大数据概述2. 大数据处理技术3. 数据仓库与数据挖掘4. 大数据分析与可视化5. 大数据平台与架构6. 大数据安全与隐私 总结 大数据基础知识点…

17、什么是智能指针,C++有哪几种智能指针【高频】

智能指针其实不是指针,而是一个(模板)类,用来存储指向某块资源的指针,并自动释放这块资源,从而解决内存泄漏问题。主要有以下四种: auto_ptr 它的思想就是当当一个指针对象赋值给另一个指针对…

CAN总线通信协议学习2——数据链路层之帧格式

1 帧格式 帧格式可理解为定义了传输的数据(叫报文)应该“长什么样”来传输,也为后续设定一些规则如错误检查机制提供了思路。 首先,帧格式可分为以下5种类型: PS:CAN总线任意一个设备可当收也可当发&#…

MATLAB中asManyOfPattern函数用法

目录 语法 说明 示例 匹配尽可能多的模式实例 指定要匹配的最小模式数 指定要匹配的最小和最大模式数 asManyOfPattern函数的功能是模式匹配次数尽可能多。 语法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…

1×1卷积的作用与原理详解

11卷积的作用与原理详解 文章目录 11卷积的作用与原理详解引言1. 什么是11卷积?2. 11卷积的数学表达3. 11卷积的主要作用3.1 改变通道数(升维/降维)3.1.1 降维(Dimension Reduction)3.1.2 升维(Dimension I…

网络配置的基本信息

目录 一、网络接口信息 1、关闭虚拟化服务 2、配置临时IP 3、配置静态IP 4、常见网络命令 5、安装Wireshark 一、网络接口信息 输入 ip address,会出现下面的内容 网卡名称及其含义: 网卡名称说明lo 表示本地回环地址。 ens32 有线网卡&#xff0c…

dify绑定飞书多维表格

dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…

深入解析Crawl4AI:为AI应用量身定制的高效开源爬虫框架

引言 在当今数据驱动的时代,人工智能(AI)和大型语言模型(LLM)的发展对高质量数据的需求日益增长。如何高效地从互联网上获取、处理和提取有价值的数据,成为了研究人员和开发者面临的关键挑战。Crawl4AI作为…

nginx 动态计算拦截非法访问ip

需求:在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天。 技术选型:使用NginxLuaRedis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑…

【软件测试】论坛系统功能测试报告

文章目录 1.前言2.项目介绍3. 对项目进行测试3.1 设计测试用例3.2 执行测试用例 1.前言 这次测试是我学习阶段的练习,由于缺少需求规格说明等文档,需要我尽可能发散思维去设计更多的测试用例。但无论如何测试至关重要,以下是核心原因&#x…

MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List

在 MyBatis 中&#xff0c;TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象&#xff0c;它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…

《HelloGitHub》第 107 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

【每日一题 | 2025】2.24 ~ 3.2

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【2.24】P10424 [蓝桥杯 2024 省 B] 好数2. 【2.25】P8665 [蓝桥杯 2018 省 A] 航班时间3. 【2.26】P10905 [蓝桥杯 2024 省 C] 回文字符串4. 【2.27】P10425 [蓝桥杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…

跟着官方文档学习UE C++ TArray容器系列 迭代 和 排序

一.首先测试下&#xff0c;官方案例 迭代器的方法&#xff0c;有点不常见。有点像个指针&#xff0c;迭代完还自带break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“结界”机制:作用域与变量可见性探秘

一、编程世界的“结界”概念 源自佛学的结界概念&#xff0c;在C中体现为作用域机制。程序中的每个函数都会形成独立的作用域屏障&#xff0c;如同魔法结界般保护内部变量&#xff0c;使其与外界的同名变量互不干扰。这种机制保证了代码模块的独立性和安全性&#xff0c;但当存…

3-6 WPS JS宏 工作表移动复制实例-1(工作表的拆分操作)学习笔记

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

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…

使用hutool将json集合对象转化为对象

集合之间相互转化 //List转Json&#xff0c;maps是List类型的参数 String json JSONUtil.toJsonStr(maps); System.out.println("这是json字符串: "json);//Json转List JSONArray objects JSONUtil.parseArray(json); List<Map> maps1 JSONUtil.toList(objec…