当前位置: 首页 > news >正文

命令模式:解耦请求与执行的优雅之道

引言:软件设计的解耦艺术

在软件开发中,我们常面临请求发起者请求执行者之间的紧密耦合问题。这种耦合会导致:

  • 系统扩展困难:新增命令需要修改现有代码
  • 功能复用受限:相同操作无法在不同上下文中重用
  • 撤销/重做复杂:操作历史难以追踪和管理

命令模式正是为解决这类问题而生的设计模式。它将请求封装成独立对象,允许你参数化客户端使用不同的请求、队列或日志请求,并支持可撤销的操作。本文将深入解析命令模式的原理、实现及高级应用场景。


一、模式定义与核心思想

1.1 官方定义

命令模式 (Command Pattern):将请求封装成对象,从而让你使用不同的请求、队列或日志请求来参数化其他对象,并支持可撤销的操作。

1.2 设计哲学

调用者Invoker
命令接口Command
具体命令ConcreteCommand
接收者Receiver

核心原则

  1. 解耦调用与执行:调用者无需知道接收者细节
  2. 命令对象化:将操作封装为可传递的对象
  3. 支持扩展:新增命令不影响现有系统结构

二、模式结构解析

2.1 UML类图

classDiagramclass Invoker {-command: Command+setCommand(Command)+executeCommand()}interface Command {<<interface>>+execute()+undo()}class ConcreteCommand {-receiver: Receiver-state+execute()+undo()}class Receiver {+action()}Invoker o--> CommandCommand <|.. ConcreteCommandConcreteCommand --> Receiver

2.2 关键角色

角色职责示例
Invoker触发命令执行遥控器按钮
Command声明执行接口命令接口
ConcreteCommand实现具体命令开灯命令
Receiver实际执行操作电灯设备

三、代码实战:智能家居控制系统

3.1 场景描述

实现智能家居控制系统:

  • 控制多种设备:灯、空调、音响
  • 支持单命令执行和宏命令(组合命令)
  • 实现撤销操作功能

3.2 核心实现

// 命令接口
public interface Command {void execute();void undo();
}// 接收者:电灯
public class Light {public void on() {System.out.println("电灯已打开");}public void off() {System.out.println("电灯已关闭");}
}// 具体命令:开灯命令
public class LightOnCommand implements Command {private final Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}@Overridepublic void undo() {light.off();}
}// 接收者:空调
public class AirConditioner {private int temperature = 26;public void setTemperature(int temp) {this.temperature = temp;System.out.println("空调温度设置为: " + temp + "℃");}public int getTemperature() {return temperature;}
}// 具体命令:设置空调温度
public class SetTemperatureCommand implements Command {private final AirConditioner ac;private final int newTemperature;private int prevTemperature;public SetTemperatureCommand(AirConditioner ac, int temperature) {this.ac = ac;this.newTemperature = temperature;}@Overridepublic void execute() {prevTemperature = ac.getTemperature();ac.setTemperature(newTemperature);}@Overridepublic void undo</
http://www.xdnf.cn/news/1005031.html

相关文章:

  • 高可靠性隔离驱动设计:NSi6602B-DSWR双通道栅极驱动器技术解析
  • stm32温湿度-超声波-LCD1602结合项目(Proteus仿真程序)
  • 判断一阶微分方程是线性齐次、线性非齐次或非线性,以及非线性方程是半线性或拟线性
  • 前端Vue3国际化开发 :使用vue-i18n库和Element Plus 组件实现
  • Tensorflow 基础知识:变量、常量、占位符、Session 详解
  • strncpy_s与_TRUNCATE
  • 汉化langfuse踩坑记录--docker卷挂载未生效问题修复及langfuse启动
  • 基于 SpringBoot + Vue 在线点餐系统(前后端分离)
  • javascript入门
  • LangGraph--搭建官方机器人聊天(带工具的)教程
  • vue 导航 + router-view 局部刷新
  • AI技术专题:电商AI专题
  • java使用aspose读取word里的图片
  • YOLOv8 模块添加与修改讲解:从源码修改到配置文件配置
  • Nacos服务注册失败解决方案
  • pysnmp 操作流程和模块交互关系的可视化总结
  • JVM深度解析:执行引擎、性能调优与故障诊断完全指南
  • 【Python从入门到精通】--pycharm虚拟环境详解
  • 深度解析关键词价值,实现精准流量匹配
  • SpringBoot解决下载接口文件名中文乱码问题的3种方法
  • Bash (Bourne Again SHell)
  • Ftrace 调试 Rockchip MIPI D-PHY 驱动步骤
  • 明远智睿SD2351核心板:边缘计算时代的工业级核心引擎深度解析
  • 深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(3)
  • DEVICENET转MODBUS TCP网关连接DeviceNet数字远程IO模块配置案例
  • 解决新版RN 热更新报错:recreateReactContextInBackground
  • Unity Mecanim C# 动画切换实践:实现随机播放待机动画
  • 网络安全:OWASP防护守则
  • Tomcat调优
  • Ntfs!NtfsAllocateRestartTableIndex函数分析和Ntfs!DIRTY_PAGE_ENTRY_V0结构的关系