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

在这里插入图片描述

目录

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

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

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

相关文章

基于单片机的智能扫地机器人

1 电路设计 1.1 电源电路 本电源采用两块LM7805作为稳压电源,一块为控制电路和传感器电路供电,另一块单独为电机供电。分开供电这样做的好处,有利于减小干扰,提高系统稳定性。 LM7805是常用的三端稳压器件,顾名思义0…

【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB AOF。第3章:使用Server自带的redis-cli工具连接。第4章…

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串(这里的有序指的是强调数据排列顺序的重要,不是升序降序的意思),列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在R…

Redis 实战篇 ——《黑马点评》(下)

《引言》 (下)篇将记录 Redis 实战篇 最后的一些学习内容,希望大家能够点赞、收藏支持一下 Thanks♪ (・ω・)ノ,谢谢大家。 传送门(上):Redis 实战篇 ——《黑马…

WordPress二次开发实现用户注册审核功能

WordPress默认直接注册登录了,不需要任何验证,如果被批量注册就麻烦了,所以添加一个审核功能比较好。 注册用户默认需要手动审核,审核以后才能登陆,开启审核,可以有效防止用户批量注册。 这儿讲解一下如何…

基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 实体属性图 系统首页界…

湖仓一体概述

湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…

React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序

功能要求: 1、渲染评论列表 2、删除评论功能:只显示自己评论的删除按钮;点击删除按钮,删除当前评论,列表中不再显示。 3、渲染导航Tab(最新 | 最热)和其 高亮实现 4、评论排序功能实现&…

springboot系列教程(三十一):springboot整合Nacos组件,环境搭建和入门案例详解

一、Nacos基础简介 1、概念简介 Nacos 是构建以“服务”为中心的现代应用架构,如微服务范式、云原生范式等服务基础设施。聚焦于发现、配置和管理微服务。Nacos提供一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管…

python爬虫报错信息解决方法

今天遇到了这样一条报错: opt/conda/envs/python35-paddle120-env/bin/python /home/aistudio/work/main.py aistudiojupyter-10415006-8838159:~$ /opt/conda/envs/python35-paddle120-env/bin/python /home/aistudio/work/main.py Traceback (most recent call la…

如何快速的解除oracle dataguard

有些时候,我们为了使oracle dg的standby库另做他用,需要解除oracle dataguard数据同步。我本地因为standby库存储出现故障,导致dg存在问题,故需要解除。今天,我们通过使用部分命令,实现dg的快速解除。 1&a…

【告别双日期面板!一招实现el-date-picker智能联动日期选择】

告别双日期面板!一招实现el-date-picker智能联动日期选择 1.需求背景2.DateTimePicker 现状图3.日期选择器实现代码4.日期选择器实现效果图5.日期时间选择器实现代码6.日期时间选择器实现效果图 1.需求背景 在用户使用时间查询时,我们经常需要按月份筛选…

Git GitHub基础

git是什么? Git是一个分布式版本控制系统,用于管理源代码的变更。它允许多个开发者在同一个项目上协作,同时跟踪每个修改的历史记录。 关键词: 分布式版本控制软件 软件 安装到我们电脑上的一个工具 版本控制 例如论文&…

汽车无人驾驶系统中的防撞设计

一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块,本文设计的系统以STM32F103C8T6单片机为主控制器,结合超声波测距、WiFi通信、人机交互等模块,实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…

深度学习笔记——线性回归的从0开始实现

记录学习到的知识: 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程,它将数字图像分成多个片段,并对每个区域中包含的信息进行分类。三种图像分割…

神经网络 - 激活函数(ReLU 函数)

一、ReLU函数: ReLU(Rectified Linear Unit,修正线性单元),也叫 Rectifier 函数 ,是目前深度神经网络中经常使用的激活函数,ReLU 实际上是一个斜坡(ramp)函数,其定义为: 也即: Re…

(十 一)趣学设计模式 之 组合模式!

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

【MySQL】事务二

事务二 1.数据库并发的场景2.读-写 2.1 3个记录隐藏字段2.2 undo日志2.3 模拟 MVCC2.4 Read View2.5 RR 与 RC的本质区别 3.读-读4.写-写 点赞???收藏???关注??? 你的支持是对我最大的鼓励,我们一起努力吧??? 关于事务的所有知识上篇博客我们都说过了&…