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

深入理解设计模式之命令模式

下面是一篇关于设计模式之命令模式(Command Pattern)的详细博客,并附有 Java 实现代码示例。


深入理解设计模式之:命令模式(Command Pattern)

一、什么是命令模式?

命令模式(Command Pattern)是一种行为型设计模式。它将“请求”封装成对象,从而使你可以用不同的请求对客户进行参数化,对请求排队、记录请求日志,以及支持可撤销的操作。

命令模式的核心思想是将请求的发起者和执行者解耦,让两者不直接交互,而是通过命令对象进行沟通。


二、命令模式的应用场景

  • 需要将操作请求、操作日志、撤销操作等功能解耦时
  • 需要支持命令的排队、记录、撤销、重做等功能
  • GUI 按钮、菜单的事件处理
  • 事务型操作(如数据库事务、宏命令)

三、命令模式的结构

  • Command(抽象命令):声明执行操作的接口
  • ConcreteCommand(具体命令):实现 Command 接口,绑定接收者对象,调用接收者相应操作
  • Receiver(接收者):知道如何实施与执行一个请求相关的操作
  • Invoker(调用者):要求命令对象执行请求
  • Client(客户端):创建具体命令对象并设置其接收者

四、命令模式的 UML 类图

+---------+        +----------------+        +-------------+
| Invoker |------->|   Command      |<-------|  Client     |
+---------+        +----------------+        +-------------+/_\|+-----------------------------+|                             |
+-------------------+      +-------------------+
| ConcreteCommandA  |      | ConcreteCommandB  |
+-------------------+      +-------------------+|                             |+-----------------------------+|+-------------+|  Receiver   |+-------------+

五、Java 实现代码示例

1. 抽象命令接口

public interface Command {void execute();
}

2. 接收者(Receiver)

public class Light {public void turnOn() {System.out.println("灯打开了");}public void turnOff() {System.out.println("灯关闭了");}
}

3. 具体命令(ConcreteCommand)

public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}

4. 调用者(Invoker)

public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}

5. 客户端(Client)

public class Main {public static void main(String[] args) {Light light = new Light();Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton(); // 输出:灯打开了remote.setCommand(lightOff);remote.pressButton(); // 输出:灯关闭了}
}

六、命令模式的优缺点

优点:

  • 解耦请求发送者和接收者
  • 易于扩展新命令
  • 支持撤销、重做、记录日志等功能
  • 可以将一组命令组合成宏命令

缺点:

  • 可能导致系统中类的数量增加
  • 结构相对复杂

七、实际应用举例

  1. GUI 按钮事件处理:每个按钮绑定一个命令对象,点击时执行命令
  2. 事务操作:数据库操作的撤销与重做
  3. 任务队列:将命令对象放入队列,异步执行

八、总结

命令模式是实现“请求-执行”解耦的经典方案,广泛应用于 GUI、事务、任务队列等场景。掌握命令模式有助于编写灵活、可扩展的代码结构。

建议:

  • 当你需要对操作进行记录、撤销、排队等管理时,优先考虑命令模式
  • 命令模式与责任链、观察者等模式常结合使用

如需更多设计模式讲解或源码分析,欢迎留言交流!

相关文章:

  • 【Web应用】基础篇04-功能详解-权限控制(创建菜单--分配角色--创建用户)
  • maven 最短路径依赖优先
  • c#基础08(数组)
  • 第十章:构建之巅 · 打包与部署的终极试炼
  • 实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.1 R语言解题
  • Docker常用操作
  • 下一代 SaaS 平台的 AI 架构重构路径——多租户 AI 服务调度 · 多角色智能辅助 · 嵌入式 AIGC 能力的融合设计
  • 欧几里得 ---> 裴蜀定理 ---> 拓展欧几里得
  • OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()
  • HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践
  • el-tree拖拽事件,限制同级拖拽,获取拖拽后节点的前后节点,同级拖拽合并父节点name且子节点加入目标节点里
  • 【华为云物联网】如何实现在 MQTT.fx 上模拟数据间隔上传一次,并按设定系数变动数据
  • 打造AI智能旅行规划器:基于LLM和Crew AI的Agent实践
  • python和java差异:关键数据类型与容器
  • PaddleNLP 的文本分类项目
  • Cmake4编译PaddleOCR3.0成功步骤
  • 分块查找详解
  • yolo最终笔记
  • 【node】Express创建服务器
  • 使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!
  • 做文案图片上什么网站/网页制作模板的网站
  • 做一家网站费用吗/seo推广怎么做视频教程
  • web网站开发有什么作用/免费产品推广软件
  • 宁国做网站的/业务推广公司
  • 免费的毕业设计网站建设/兰州seo优化
  • 软件测试2个月能学会吗/黑帽seo