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

news2025/3/4 2:52:08

在这里插入图片描述

目录

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

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

    @Override
    public void execute() {
        tv.on(); // 执行开机操作
    }

    @Override
    public void undo() {
        tv.off(); // 撤销开机操作
    }
}

// 具体命令类:关机命令
public class OffCommand implements Command {
    private TV tv; // 电视机

    public OffCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.off(); // 执行关机操作
    }

    @Override
    public 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.coloradmin.cn/o/2309281.html

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

相关文章

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

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

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

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

【项目管理】基于 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;强调试错…

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

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

数据图表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"…

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

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

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…

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

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

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…

创建一个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…

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…

计算机毕业设计SpringBoot+Vue.js人力资源管理系统(源码+文档+PPT+讲解)

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

腾讯云扩容记录

腾讯云扩容&#xff1a; sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理&#xff1a; 1. 安装 cloud…

Cherry Studio + 火山引擎 构建个人AI智能知识库

&#x1f349;在信息化时代&#xff0c;个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时&#xff0c;效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…