Java设计模式 十七 命令模式 (Command Pattern)

熵码匠艺:软件开发中的负熵实践与匠艺级编码规范 在软件系统中,‘熵’象征需求变更、知识流失、技术债累积等天然混乱趋势;而‘匠艺’并非艺术化编码,而是通过可度量、可传承的工程实践持续注入‘负熵流’,对抗系统腐化。其核心在于命名清晰性、构造函数精简性、封装严谨性、函数单一职责及测试即设计等基础能力。这些实践不依赖特定框架或职级,而是嵌入日常编码的肌肉记忆——如用解释性变量替代复杂表达式、用策略模式替代布尔开关、用IClock抽象替代DateTime.Now硬依赖。它们共同支撑起系统的可维护性、可演进性与故障可追溯性,是金融核心、电信计费、SaaS中间件等长生 阅读详情

命令模式 (Command Pattern)

命令模式是一种行为型设计模式,它将请求(或操作)封装成一个对象,从而使得用户可以通过不同的请求执行不同的操作,甚至支持撤销操作。命令模式的关键在于:将请求的发送者和请求的接收者解耦,并将请求封装成一个对象。这样,发送者只需要将请求发送给一个命令对象,而无需关心请求的具体实现和执行过程。


1. 命令模式的组成

命令模式通常包含以下几个角色:

  • Command(命令接口):定义了执行命令的接口,通常有一个execute()方法,所有具体的命令类都需要实现这个接口。
  • ConcreteCommand(具体命令类):实现了Command接口,并将具体的请求委托给接收者对象。
  • Invoker(调用者):请求的发送者,持有命令对象并触发命令的执行。
  • Receiver(接收者):实际执行命令的对象,它负责执行具体的操作。
  • Client(客户端):负责创建具体命令对象并将其传递给调用者。

2. 命令模式的工作流程

  1. 客户端创建一个具体命令对象(ConcreteCommand),并设置相应的接收者。
  2. 客户端将命令对象传递给调用者(Invoker)。
  3. 调用者通过调用命令对象的execute()方法来执行请求。
  4. 命令对象将请求委托给接收者对象,由接收者完成实际的操作。

3. 命令模式的实现

场景示例:遥控器操作

假设我们有一个遥控器,它能够控制多个家电设备(如灯、电视、空调等)。我们希望通过命令模式实现每个设备的开/关操作,并且支持撤销操作。


1) 定义命令接口

命令接口定义了一个execute()方法,所有具体命令类都要实现这个方法。

// 命令接口
public interface Command {
    void execute();
    void undo();  // 撤销操作
}

2) 定义具体命令类

具体命令类实现了命令接口,并调用接收者(家电)的实际操作方法。

// 开灯命令
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }

    @Override
    public void undo() {
        light.turnOff();
    }
}

// 关灯命令
public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }

    @Override
    public void undo() {
        light.turnOn();
    }
}

3) 定义接收者类

接收者类是真正执行命令的类(例如,家电设备)。它包含具体的业务逻辑。

// 灯类(接收者)
public class Light {
    public void turnOn() {
        System.out.println("The light is ON");
    }

    public void turnOff() {
        System.out.println("The light is OFF");
    }
}

4) 定义调用者类

调用者类持有命令对象,并通过execute()方法来请求执行操作。

// 遥控器(调用者)
public class RemoteControl {
    private Command command;

    // 设置命令
    public void setCommand(Command command) {
        this.command = command;
    }

    // 执行命令
    public void pressButton() {
        command.execute();
    }

    // 撤销操作
    public void pressUndoButton() {
        command.undo();
    }
}

5) 客户端代码

客户端代码创建了遥控器、命令对象和接收者对象,并将命令对象设置到遥控器中。

public class Client {
    public static void main(String[] args) {
        // 创建接收者
        Light livingRoomLight = new Light();
        
        // 创建命令对象
        Command lightOn = new LightOnCommand(livingRoomLight);
        Command lightOff = new LightOffCommand(livingRoomLight);

        // 创建遥控器(调用者)
        RemoteControl remoteControl = new RemoteControl();
        
        // 执行开灯命令
        remoteControl.setCommand(lightOn);
        remoteControl.pressButton();  // 输出:The light is ON
        
        // 执行关灯命令
        remoteControl.setCommand(lightOff);
        remoteControl.pressButton();  // 输出:The light is OFF
        
        // 撤销上一个命令(开灯)
        remoteControl.pressUndoButton();  // 输出:The light is ON
    }
}

运行结果:
The light is ON
The light is OFF
The light is ON

4. 命令模式的优点

  1. 解耦发送者和接收者: 发送请求的类(调用者)与接收请求的类(接收者)解耦,发送者无需知道请求的执行细节。
  2. 支持撤销操作: 每个命令对象都可以定义撤销操作(undo()),允许在需要时撤销操作。
  3. 扩展性: 可以轻松添加新的命令,只需要创建新的命令类而不需要修改现有代码,符合开闭原则。
  4. 组合命令: 可以通过组合多个命令来实现更复杂的操作,如“宏命令”。
  5. 事务性操作: 命令模式可以用于将操作封装成单独的事务,并在系统中进行管理。

5. 命令模式的缺点

  1. 类的数量增加: 每一个新的命令都需要一个新的命令类,这可能导致类的数量急剧增加,增加系统的复杂度。
  2. 实现复杂: 对于较简单的操作,使用命令模式可能会显得过于复杂,导致不必要的设计开销。

6. 命令模式的应用场景

  1. GUI系统中的操作: 如按钮点击事件、菜单操作等,可以使用命令模式来封装每个按钮的动作。每个按钮对应一个命令对象,点击时执行相应的命令。
  2. 任务队列: 命令模式适用于任务调度系统,每个任务可以封装成一个命令,系统可以按照需要顺序执行或撤销任务。
  3. 宏命令: 需要将多个命令组合成一个大的操作时,可以使用命令模式组合多个小命令。
  4. 实现撤销/重做操作: 例如,文本编辑器中的撤销/重做功能,可以利用命令模式管理操作的历史记录。

7. 总结

命令模式通过将请求封装成对象,解耦了请求的发送者和接收者,提供了灵活的执行、撤销和组合命令的能力。它在需要解耦请求和执行的场景中非常有用,尤其适用于GUI系统、任务调度、宏命令等应用场景。虽然命令模式可能增加系统的复杂度,但它在结构上更具可扩展性和灵活性,非常适合处理复杂的操作逻辑。

法律人AI开发工具实战指南:Claude Code、Cursor与Codex深度解析 法律AI开发工具正从‘聊天助手’升级为具备代码级控制力、协议级互操作性与工作流嵌入能力的专业案头系统。其核心在于将法律文本视为可计算对象,依托MCP(模型控制协议)实现多AI协同,通过CLI(命令行接口)驱动结构化分析任务。这类工具并非要求法律人掌握编程,而是赋能其用自然语言指令完成条款映射、判例要旨提炼、合同风险批量筛查等中间层任务,显著提升法律文本处理的准确性、可复现性与审计合规性。本文聚焦真实法律场景,详解Claude Code的条款语义建模、Cursor的可视化工作流编排及Codex的离线条款解析能 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南06

376: 分布式配置中心+配置加密+密钥管理+自动轮换+审计+回滚+健康检查+灰度+多集群+多租户+配置漂移检测+自动修复+合规+联邦学习+混沌工程+事件驱动+多语言SDK+配置可视化+配置模板+变量替换+配置对比+差异可视化+配置导入导出+配置订阅+WebHook+配置权限管理+RBAC+配置标签+配置搜索+配置依赖图+配置影响分析+配置历史趋势+配置预测+配置自动生成+配置推荐+配置健康评分+配置自愈+配置拓扑+配置热加载。故障恢复时,从上一个完成的checkpoint恢复,未提交的文件被丢弃。

weixin_49199313的博客 265

Java中的24种设计模式

一、策略模式【STRATEGY PATTERN】 二、代理模式【PROXY PATTERN】 三、单例模式【SINGLETON PATTERN】 四、多例模式【MULTITION PATTERN】 五、工厂方法模式【FACTORY METHOD PATTERN】 六、抽象工厂模式【ABSTRACT FACTORY PATTERN】 七、门面模式【FACADE PATTERN】 八、适

814

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 403

用到的vim命令

vim模式: 编辑模式(命令模式)输入模式末行模式 模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式; a: 在当前光标所在字符的后面,转为输入模式; o: 在当前光标所在行的下方,新建一行,并转为输入模式; I:在当前光标所在行的行首,转换为输入模式 A:在当前光标所在行的行尾,转换为输入模式

ihuaqiang的博客 321

从压电传感器到示波器:手把手教你用CA3140搭建电荷放大器(含PCB布局与调零技巧)

本文详细介绍了如何使用CA3140运算放大器搭建专业级电荷放大器,从压电传感器信号特性分析到PCB布局与调零技巧,全程实战演示。重点解析了CA3140的低通滤波器设计、反馈网络参数计算及抗干扰增强方案,帮助电子爱好者高效实现微弱电荷信号的稳定转换与测量。

weixin_31355483的博客 597

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8851

shell编写脚本

shell脚本编写方法

m0_57802932的博客 241

【电子电力】IEEE33节点系统参数及拓扑图visio

IEEE33节点系统是一种广泛用于电力系统分析和研究的标准配电网络。该系统具有典型的辐射结构,适用于负载流分析、分布式发电优化及电力系统的可靠性评估。本报告主要基于IEEE33节点系统的拓扑图,讨论其在电子电力系统中的应用。通过MATLAB仿真分析了节点的电压分布、功率损耗等关键参数,并验证了系统的稳定性和有效性。

2401_84610415的博客 1万+

Java基础面试题总结《八》

确认进程 -> 抓取现场 (Processlist) -> 分析计划 (Explain) -> 优化/限流。大多数情况下,通过优化索引和 SQL 语句即可解决问题;若是业务量激增,则需从架构层面考虑读写分离或扩容。这个问题考察的是对 Redis 基础定位的宏观认知。回答时不仅要说出它是什么,还要解释它为什么强,以及能干什么。对于绝大多数互联网业务,“先更新数据库,再删除缓存” + “基于消息队列/Binlog 的重试机制”是保证最终一致性的最佳实践。它既保证了高性能,又能容忍极小概率的短暂不一致。

qq_55862497的博客 334

IEEE 754浮点数与十六进制转换:从原理到实战避坑指南

在计算机系统中,数据的二进制表示与内存布局是底层开发的核心基础。IEEE 754标准定义了浮点数在内存中的精确格式,包括符号位、指数位和尾数位的分工,以及零、无穷大和NaN等特殊值的编码。理解这一原理对于处理原始字节流至关重要,尤其是在涉及跨平台或跨设备通信时。其技术价值在于,它能帮助开发者从根本上解决数据解析错误、通信协议不一致以及程序调试中的“灵异”问题。在嵌入式开发、网络通信(如Modbus协议)和固件解析等应用场景中,浮点数与十六进制的转换是高频操作。然而,字节序(大端/小端)是转换过程中最常见的“

weixin_33835103的博客 430

嵌入式模拟电路面试题大全及参考答案(持续更新)

高输入阻抗:由于晶体管的基极-发射极(BJT)或栅极-源极(MOSFET)电压很低,跨导放大器具有很高的输入阻抗。低输出阻抗:晶体管的集电极-发射极或漏极-源极电阻较低,提供较低的输出阻抗。电压控制:输入信号控制晶体管的跨导,从而控制输出电流。晶体管:作为放大器的核心,可以是BJT或MOSFET。偏置电路:为晶体管提供稳定的工作点,确保其在放大区域内工作。负载电阻:与晶体管的集电极或漏极连接,将电流转换为电压。晶体管的选择:根据所需的增益、速度和功率消耗选择合适的晶体管。偏置稳定性。

大模型大数据攻城狮的专栏 988

Shell if else 实战避坑指南:从静默失败到生产可用

Shell 脚本中的 if else 表面简单,实为高危逻辑枢纽——它不依赖布尔值,而完全基于命令退出码(0/非0)驱动分支;其健壮性直接受限于空格语法、变量引号、`[ ]` 与 `[[ ]]` 兼容性等底层机制。掌握这些原理,才能规避空值崩溃、跨平台失效、grep 误判等高频故障,在自动化运维、CI/CD 和日志轮转等关键场景中构建可靠判断链。本文聚焦 Shell Script 核心语法陷阱与工程化实践,提供可直接复用的防御式写法、POSIX 兼容方案及真实故障调试路径。

448

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 353

Claude Code CLI:终端原生的AI编程协作者实战指南

AI编程已从单行补全迈入上下文感知的工程协作新阶段。CLI工具凭借终端原生、多文件上下文理解、可脚本化与可审计等特性,成为现代软件开发中不可或缺的‘第三只手’。其核心原理在于将项目结构、AST元数据与自然语言指令协同输入,实现跨文件符号解析与可验证推理,技术价值体现在自动化架构审计、CI/CD深度集成及遗留系统快速认知等关键场景。本文聚焦Claude Code CLI这一典型终端AI编程工具,深入解析其安装避坑、认证管理、上下文控制、真实工作流编排及安全边界实践,覆盖开发者从零部署到生产就绪的完整链路。

455

手把手教你学Simulink——基于电机驱动系统的场景实例:永磁同步电机(PMSM)在电动汽车中的矢量控制仿真

随着全球对环境保护的关注增加,电动汽车(Electric Vehicle, EV)因其环保特性而受到广泛关注。永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)由于其高效率、高功率密度和良好的动态响应性能,在电动汽车驱动系统中得到了广泛应用。矢量控制(Field-Oriented Control, FOC)是实现PMSM高性能控制的关键技术之一,它能够实现对电机转矩和磁场的独立控制,从而达到类似直流电机的控制效果。本文将详细介绍如何使用来构建一个。

MHD0815的博客 1万+

智能测试策略优化:平衡覆盖率、时间和资源

在软件开发过程中,测试是确保软件质量的关键环节。然而,测试工作往往面临着诸多挑战,其中如何在保证测试覆盖率的前提下,合理分配时间和资源是一个核心问题。本文章的目的在于探讨智能测试策略的优化方法,帮助软件测试团队在有限的时间和资源条件下,实现尽可能高的测试覆盖率。文章的范围涵盖了智能测试策略的核心概念、算法原理、数学模型、实际应用案例以及相关工具和资源等方面。本文将按照以下结构进行组织:首先介绍智能测试策略优化的背景和相关概念,包括核心术语和缩略词的定义;

AIGC应用创新大全的博客 620

【springboot】万字操作指南 Spring Boot 2.x 升级到 3.x:微服务项目实战

摘要: 本文提供Spring Boot 2.x升级到3.x的实战指南,重点针对微服务项目。升级涉及JDK 17、Spring Framework 6、Jakarta EE等连锁变化,需系统规划版本矩阵(如Spring Boot 3.5.x + Spring Cloud 2025.0.x)。建议升级路线:先统一JDK 17环境,再处理依赖迁移(javax→jakarta)、Spring Security 6适配、OAuth2授权服务器改造等关键步骤。

Cjh20pan的博客 975

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

flutter学习笔记

1.跨平台移动UI框架2.与现有的代码一起工作(可以直接嵌入到原生代码中或直接把原生代码嵌入到自己的代码中运行)3. 完全免费、开源。

haoxuhong的博客 8244

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

硬核 Linux“ 修炼 “之路

“多一句没有,少一句不行,用最短的时间,干最硬的事! "

难~赴 422

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 271

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 230

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 125

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 196

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 106
上一篇: Java设计模式 十四 行为型模式 (Behavioral Patterns)
下一篇: Java设计模式 十八 状态模式 (State Pattern)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8358粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值