一、核心定义与目标

命令模式通过对象化请求,将操作的具体实现细节隐藏在命令对象中,使得调用者(Invoker)无需直接与接收者(Receiver)交互,仅需通过命令对象间接调用。这种解耦设计支持以下功能:

  1. 请求队列化:命令对象可存储、传递并按需执行。
  2. 撤销与重做:通过记录命令历史实现操作回滚。
  3. 日志记录与事务支持:便于追踪和恢复系统状态。

二、模式结构与角色

命令模式涉及以下核心角色:

  1. Command(抽象命令接口)
    定义执行命令的统一接口,通常包含execute()方法。
    public interface Command { void execute(); 
    }
    
  2. ConcreteCommand(具体命令类)
    实现Command接口,持有接收者(Receiver)的引用,并调用其具体方法。
    public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) { this.light = light; }public void execute() { light.turnOn(); }
    }
    
  3. Receiver(接收者)
    实际执行操作的对象,例如电灯、音响设备等。
    public class Light {public void turnOn() { System.out.println("开灯"); }
    }
    
  4. Invoker(调用者)
    负责触发命令的执行,但不关心命令的具体实现。
    public class RemoteControl {private Command command;public void setCommand(Command command) { this.command = command; }public void pressButton() { command.execute(); }
    }
    
  5. Client(客户端)
    创建具体命令对象并关联接收者,将其传递给调用者。

三、代码示例与实现

场景:遥控器控制电灯

  1. 定义接收者
    class Light {public void on() { System.out.println("灯开启"); }public void off() { System.out.println("灯关闭"); }
    }
    
  2. 实现具体命令
    class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) { this.light = light; }public void execute() { light.on(); }
    }
    
  3. 调用者与客户端
    public class Client {public static void main(String[] args) {Light light = new Light();Command command = new LightOnCommand(light);RemoteControl control = new RemoteControl();control.setCommand(command);control.pressButton(); // 输出:灯开启}
    }
    
    结果:通过调用者间接控制接收者,实现解耦。

四、高级应用场景

  1. 宏命令(Macro Command)
    将多个命令组合成一个复合命令,例如批量执行操作:
    class MacroCommand implements Command {private List commands = new ArrayList<>();public void add(Command cmd) { commands.add(cmd); }public void execute() { commands.forEach(Command::execute); }
    }
    
  2. 撤销与重做(Undo/Redo)
    通过扩展命令对象的undo()方法实现撤销功能:
    public interface UndoableCommand extends Command {void undo();
    }
    
  3. 异步命令队列
    结合线程池处理异步任务,提升系统吞吐量。

五、优缺点分析

优点缺点
解耦请求发送者与接收者,提升灵活性可能导致类爆炸问题(每个命令需独立类)
支持扩展新命令,符合开闭原则增加系统复杂度,需额外管理命令对象
便于实现撤销、日志记录等高级功能过度设计风险,简单场景可能不必要

六、适用场景

  1. 需要将请求参数化或延迟执行(如GUI按钮点击)。
  2. 需支持撤销/重做操作(如文本编辑器)。
  3. 系统需记录操作日志或实现事务管理。

七、与其他模式的对比

策略模式:关注算法替换,而命令模式关注请求封装。

  • 观察者模式:通过订阅-发布机制解耦,而命令模式通过对象化请求解耦。

总结

命令模式通过对象化请求实现了灵活的调用机制,是构建可扩展、可维护系统的利器。但在实际应用中需权衡其复杂性,避免滥用。结合具体场景(如撤销操作、异步任务)选择是否引入该模式,可显著提升代码的解耦性与扩展性。

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

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

相关文章

【深度学习新浪潮】xAI新发布的Grok4有什么看点?

Grok4作为马斯克旗下xAI公司最新发布的旗舰AI模型,其核心看点和评测要点可总结如下: 一、Grok4的核心看点 学术推理能力全面超越人类博士水平 在「人类终极考试」(HLE)中,Grok4基础版正确率达25.4%,启用工具后飙升至44.4%,远超Gemini 2.5 Pro(21.6%)和OpenAI o3(20.…

观成科技:基于自监督学习技术的恶意加密流量检测方案

1.前言当前&#xff0c;随着加密协议技术的广泛应用&#xff0c;互联网用户的个人流量隐私得到了有效保护&#xff0c;但与此同时也衍生出一系列安全问题。由于加密流量在传输过程中无法被解密&#xff0c;导致传输信息呈现“黑盒化”特征&#xff0c;这为恶意攻击者利用加密流…

通用定时器GPT

目录 GPT核心特性 GPT 计数器操作模式 重启模式 自由运行模式 GPT时钟源 GPT框图 输入捕获&#xff1a;测量外部信号的高电平脉冲宽度 输出比较&#xff1a;生成 1kHz PWM 波 GPT模块外部引脚复用与功能映射表 GPT使用注意事项 GPT Memory Map GPT寄存器 GPTx_CR寄存…

#oda0095. 字符串通配符【B卷 100分】-字符串

题目描述问题描述&#xff1a;在计算机中&#xff0c;通配符一种特殊语法&#xff0c;广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。要求&#xff1a;实现如下2个通配符&#xff1a;* &#xff1a;匹配0个或以上的字符&#xff08;注&…

面向对象设计原则

面向对象&#xff1a;是一种编程思想&#xff0c;面向过程是关注实现的步骤&#xff0c;每个步骤定义一个函数&#xff0c;调用函数执行即可。面向对象关注的是谁来执行&#xff0c;把具有相同属性和行为的一类事物进行抽象成类&#xff0c;然后再通过实例化出一个个具体的对象…

Hyperledger Fabric深入解读:企业级区块链的架构、应用与未来

一、引言&#xff1a;企业级区块链的标杆Hyperledger Fabric是Linux基金会主导的开源项目&#xff0c;专为企业级应用设计&#xff0c;以模块化架构、许可链机制和隐私保护为核心&#xff0c;广泛应用于金融、供应链、医疗等领域。相较于公有链&#xff08;如以太坊&#xff09…

从0开始学习R语言--Day45--Hausman检验

当我们在探究数据本身是否和变量相关时&#xff0c;往往都会对这两者进行回归分析&#xff0c;控制一下变量来看看趋势走向。但其实在分析前&#xff0c;我们可以先尝试做Hausman检验&#xff0c;这可以帮助我们判断数据的变化到底是因为变量不一样了还是因为自己的个体效应所以…

闲庭信步使用图像验证平台加速FPGA的开发:第九课——图像插值的FPGA实现

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

Android事件分发机制完整总结

一、核心概念事件分发的本质Android事件分发采用责任链模式&#xff0c;事件从Activity开始&#xff0c;依次经过ViewGroup和View。整个机制只有一个入口&#xff1a;dispatchTouchEvent方法。onInterceptTouchEvent和onTouchEvent都不是独立的事件入口&#xff0c;而是被dispa…

【论文阅读】AdaReasoner: Adaptive Reasoning Enables More Flexible Thinking

AdaReasoner: Adaptive Reasoning Enables More Flexible Thinking3. AdaReasoner3.1 动机3.2 问题定义3.3 动作选择过程3.3.1 动作空间定义3.3.2 动作选择3.4 探索策略3.5 强化学习训练3.5.1 训练算法3.5.2 目标函数3.5.3 损失函数AdaReasoner: Adaptive Reasoning Enables Mo…

深入了解Modbus TCP:工业通信的“通用语言”

目录 简介一、Modbus TCP的“前世今生”二、Modbus TCP的核心特点三、Modbus TCP的工作原理1. 报文结构2. 功能码四、Modbus TCP的应用场景五、使用Modbus TCP的注意事项六、总结简介 在工业自动化的世界里,不同设备之间的“对话”至关重要。从PLC(可编程逻辑控制器)到传感…

基于Selenium和FFmpeg的全平台短视频自动化发布系统

一、项目背景与概述在当今短视频营销盛行的时代&#xff0c;许多企业和个人需要同时管理多个短视频平台账号。手动上传视频到抖音、快手、小红书等平台不仅效率低下&#xff0c;而且容易出错。本文将介绍一个基于Python的自动化短视频处理与发布系统&#xff0c;它能够&#xf…

技术演进中的开发沉思-31 MFC系列:类层次结构

提及MFC&#xff0c;不得不说他的类层次。如果把 MFC 框架比作是座精密的钟表&#xff0c;那类层次结构便是其内部咬合的齿轮组。每个类都有明确的 “家族地位”&#xff0c;既继承着先辈的本领&#xff0c;又发展出独特的专长。这种层级分明的设计&#xff0c;让 Windows 编程…

2023.05.06 更新前端面试问题总结(12道题)

2023.05.04 - 2023.05.06 更新前端面试问题总结&#xff08;12道题&#xff09; 获取更多面试相关问题可以访问 github 地址: https://github.com/pro-collection/interview-question/issues gitee 地址: https://gitee.com/yanleweb/interview-question/issues 目录&#xff1…

【网络】Linux 内核优化实战 - net.ipv4.tcp_keepalive_intvl

目录1. TCP Keep-Alive 机制回顾2. 参数作用3. 参数取值与影响4. 使用场景与建议5. 相关参数6. 如何配置该参数临时生效&#xff08;重启后失效&#xff09;&#xff1a;永久生效&#xff08;需重启或重载配置&#xff09;&#xff1a;7. 性能优化建议8. 监控与故障排查net.ipv…

20250710解决KickPi的K7的SDK编译异常:rk3576-android14.0-25250704.tar.gz【降低BUILD_JOBS】

20250710解决KickPi的K7的SDK编译异常&#xff1a;rk3576-android14.0-25250704.tar.gz【降低BUILD_JOBS】 2025/7/10 20:59缘起&#xff1a;KickPi的K7的SDK编译异常&#xff1a;rk3576-android14.0-25250704.tar.gzZ:\14TB\SDK\rk3576_data\1-SDK软件源码\Android14\20250704…

《Java EE与中间件》实验一 基于MyBatis的留言本

目 录 一、实验目的和要求 1、实验目的 2、实验要求 二、实验实现思路及步骤 1、实验思路 2、实验步骤 3、实验方案 三、主要开发工具 四、实验效果及实现代码 1、留言本数据库构建实现 &#xff08;1&#xff09;建立javaee-project数据库 &#xff08;2&#xf…

ARM汇编编程(AArch64架构) - 第14课:安全扩展(ARM TrustZone)

目录1. TrustZone基础概念1.1 安全扩展架构1.2 关键组件2. 世界切换机制2.1 状态切换流程2.2 关键寄存器配置3. SMC调用实现3.1 调用规范3.2 完整调用流程4. 实战练习4.1 实验&#xff1a;实现双世界通信4.2 调试技巧1. TrustZone基础概念 1.1 安全扩展架构 startuml rectang…

OpenCV哈希算法------Marr-Hildreth 边缘检测哈希算法

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该类实现了 Marr-Hildreth 边缘检测哈希算法&#xff08;Marr-Hildreth Hash&#xff09;&#xff0c;用于图像相似性比较。它基于 Marr-Hildreth …

【git#5】远程操作 标签管理

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xff0c;前进的道路也不会永远一马平川&#xff0c;如何面…