23中设计模式之一— — — —命令模式的详细介绍

命令模式 Command Pattern讲解

  • 概念
  • 描述
    • 模式结构
      • 主要角色
      • 模式的UIM类图
      • 模式优点
      • 模式缺点
      • 应用场景
      • 实例演示
        • 类图
        • 代码演示
        • 运行结果

概念

命令模式(别名:动作,事务)
命令模式是一种行为设计模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

描述

命令模式的本质封装请求
在命令模式中,我们通常会定义一个抽象的Command接口,其中声明了一个execute()方法。具体的命令类(ConcreteCommand)将实现这个execute()方法,将一个发送者(Invoker)的请求转换为一个或多个接收者(Receiver)的操作。发送者并不知道接收者的具体实现,它只需要触发命令对象的execute()方法即可

模式结构

主要角色

1、命令接口(Command Interface):定义了一个统一的执行操作的接口,通常包含一个execute()方法。
2、具体命令(Concrete Command):实现了命令接口,负责具体的业务逻辑处理。它通常会持有对接收者(Receiver)的引用。
3、接收者(Receiver):真正知道如何执行命令的实体。任何类都可能成为一个接收者。
4、调用者/请求者(Invoker/Client):负责调用命令对象的execute()方法,它并不关心命令是如何被执行的,也不知道具体的接收者是谁。

模式的UIM类图

在这里插入图片描述

模式优点

1、在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
2、命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。
3、由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
4、使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。

模式缺点

  • 类数量增加:引入了大量的命令类,可能会导致类的数量急剧增加,增加了系统的复杂度。
  • 设计复杂度:在包含大量命令和复杂撤销操作的系统中,设计和管理命令模式可能会比较复杂。

应用场景

  • UI事件处理:在图形界面系统中,用户的各种操作(如点击按钮)可以被封装为命令对象,然后由控制器统一处理。
  • 日志与事务:通过命令模式记录用户的操作日志,便于后续审计或回滚事务。
  • 宏命令:将多个命令组合成一个宏命令,实现批量操作。
  • 支持撤销/重做功能:命令模式天然适合于实现软件中的撤销和重做功能。

实例演示

题目:模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头

类图

在这里插入图片描述

代码演示
package task2;public interface Command {public void execute();}package task2;public class Light {public void on() {System.out.println("灯找了");}public void off() {System.out.println("灯灭了");}}package task2;public class OnLightCommand implements Command {public Light light;public OnLightCommand(Light light) {// TODO Auto-generated constructor stubthis.light=light;}public void execute() {light.on();}}package task2;public class OffLightCommand implements Command {public Light light;public OffLightCommand(Light light) {// TODO Auto-generated constructor stubthis.light=light;}public void execute() {light.off();}}package task2;public class Camera {public void on(){System.out.println("摄像头开了");}public void off(){System.out.println("摄像头灭了");}}package task2;public class OnCameraCommand implements Command {public Camera camera;public OnCameraCommand(Camera camera){this.camera=camera;}public void execute() {camera.on();}}package task2;public class OffCameraCommand implements Command {public Camera camera;public OffCameraCommand(Camera camera){this.camera=camera;}public void execute(){camera.off();}}package task2;public class Invoker {public Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand(Command command) {command.execute();}}

测试类

package task2;public class Test {public static void main(String[] args) {Light light = new Light();Command command1 = new OnLightCommand(light);Command command2 = new OffLightCommand(light);Invoker invoker = new Invoker();invoker.setCommand(command1);invoker.executeCommand(command1);invoker.setCommand(command2);invoker.executeCommand(command2);Camera camera = new Camera();Command command3 = new OnCameraCommand(camera);Command command4 = new OffCameraCommand(camera);invoker.setCommand(command3);invoker.executeCommand(command3);invoker.setCommand(command4);invoker.executeCommand(command4);}}

在这个例子中,Command 是一个接口,定义了 execute 方法。OnLightCommand OffLightCommand OnCameraCommand OffCameraCommand 是 Command 接口的具体实现.Invoker 是请求者,它持有一个 Command 对象,并提供了获取命令并执行命令。

运行结果

在这里插入图片描述
博主用心写,读者点关注;互动传真情,知识不迷路

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

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

相关文章

【qt】项目移植

项目移植 一.前言二.同名问题三.具体操作1.修改文件名2.修改类名3.修改一些不能自动改的名4.修改.ui文件5.删除原来自动生成的ui_xxx.h文件6.修改头文件 四.导入项目五.使用导入的项目六.项目建议 一.前言 终于概率论考完了,有时间了,接着上个项目,我们继续来完成我们的多窗口开…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码,可以帮助我们去自动调整空格等,根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用: 可以保证python2/3解释器在读取文件的时候按…

jmeter并发测试

目录 常用的压测工具jmeter安装配置并执行新建测试计划 Test Plan添加线程组练习01:共10个线程,每秒钟启动一个线程(需要10秒),每个线程发送两个请求练习02:共10个线程,1秒中内启动完毕&#xf…

kali中安装、卸载程序教程

1、安装教程 ①、使用apt安装 apt update (先更新apt) apt-get install xxxx(xxx为需要安装的软件名)②、使用dpkg安装 dpkg –i deb的软件包名(需要在软件包的目录下使用,不然就要把地址加上)二、卸载教程 ①、使…

ViewModel原理分析

认识 ViewModel ViewModel 是一种用来存储和管理UI相关数据的类。 ViewModel 的作用可以从两个方面去理解: UI界面控制器:在最初的MVC模式中,由于 Activity / Fragment 承担的职责过重,因此在后续的 MVP、MVVM 模式中&#xff…

基于JSP技术的人事管理系统

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:浏览器(如360浏览器、谷歌浏览器、QQ浏览器等&#xff…

深度神经网络——什么是扩散模型?

1. 概述 在人工智能的浩瀚领域中,扩散模型正成为技术创新的先锋,它们彻底改变了我们处理复杂问题的方式,特别是在生成式人工智能方面。这些模型基于高斯过程、方差分析、微分方程和序列生成等坚实的数学理论构建。 业界巨头如Nvidia、Google…

【C语言】文件操作(下卷)

前言 在上一卷中,我们知道了文件指针、文件的打开和关闭(打开其他位置的文件)、文件的顺序读写(其中的fputc()、fgetc()),这一卷中,将继续讲解文件操作未讲到的地方。 内容有点多,…

人大金仓数据库报sys_user表字段不存在的问题

目录 一.问题: 二.原因 三.解决方法: 一.问题: 公司的一个项目从oracle切换到人大金仓之后,突然报了一个sys_user里面的字段不存在。 二.原因 检查了很多次确信sys_user表没问题,查了相应的文档之后发现原来人大金…

企业自建邮件系统的优势,安全性更高,功能更灵活,维护更便捷

在当今企业信息管理的浪潮中,企业邮件系统显得尤为关键,它不仅加强了内部的沟通效率,还对外展示了企业的专业形象。然而,传统租用企业邮箱服务存在一些不足,如缺乏灵活性、数据管理混乱和难以实现个性化需求&#xff0…

Wireshark 如何查找包含特定数据的数据帧

1、查找包含特定 string 的数据帧 使用如下指令: 双引号中所要查找的字符串 frame contains "xxx" 查找字符串 “heartbeat” 示例: 2、查找包含特定16进制的数据帧 使用如下指令: TCP:在TCP流中查找 tcp contai…

服务器数据恢复—raid5阵列上层XFS文件系统数据恢复案例

服务器存储数据恢复环境: 某品牌CX4-480型号服务器存储,该服务器存储内有一组由20块硬盘组建的raid5磁盘阵列;存储空间分配了1个lun。 服务器存储故障: 工作人员将服务器重装操作系统后,未知原因导致服务器操作系统层…

LlamaIndex 一 简单文档查询

前言 在学习LangChain的时候,我接触到了LlamaIndex。它犹如我在开发vue时用到的axios,主要负责数据打理。别问我为什么打这个比方,前端老狗,重走AI路,闭关一年能否学的妥当? LlamaIndex 是一个用于 LLM 应…

前端项目打包、部署的基础 (vue)

详细请看B站视频 BV19n4y1d7Gr 《禹神:前端项目部署指南,前端项目打包上线》,本博客为自用视频笔记。 目录 项目打包vue打包打包前分析项目请求 本地服务器部署问题 & 解决问题1:刷新页面404问题问题2:ajax请求废…

【人工智能】第六部分:ChatGPT的进一步发展和研究方向

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

秀肌肉-海外短剧系统的案例展示

多语种可以选择,分销功能,多种海外支付方式,多种登录模式可供选择,总之你想到的我们都做了,你没想到的我们也都做了

Partially Spoofed Audio Detection论文介绍(ICASSP 2024)

An Efficient Temporary Deepfake Location Approach Based Embeddings for Partially Spoofed Audio Detection 论文翻译名:一种基于部分欺骗音频检测的基于临时深度伪造位置方法的高效嵌入 摘要: 部分伪造音频检测是一项具有挑战性的任务&#xff0…

NSSCTF-Web题目6

目录 [NISACTF 2022]checkin 1、题目 2、知识点 3、思路 [NISACTF 2022]babyupload 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]1z_unserialize 1、题目 2、知识点 3、思路 [NISACTF 2022]checkin 1、题目 2、知识点 010编辑器的使用、url编码 3、思路 打…

基于NANO 9K 开发板加载PICORV32软核,并建立交叉编译环境

目录 0. 环境准备 1. 安装交叉编译器 2. 理解makefile工作机理 3. 熟悉示例程序的代码结构,理解软核代码的底层驱动原理 4. 熟悉烧录环节的工作机理, 建立下载环境 5. 编写例子blink, printf等, 加载运行 6. 后续任务 0.…

2024年华为OD机试真题-多段线数据压缩-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集)​ 题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3…