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

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


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

一、什么是命令模式?

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

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


二、命令模式的应用场景

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

三、命令模式的结构

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

四、命令模式的 UML 类图

复制代码
+---------+        +----------------+        +-------------+
| Invoker |------->|   Command      |<-------|  Client     |
+---------+        +----------------+        +-------------+
                      /_\
                       |
         +-----------------------------+
         |                             |
+-------------------+      +-------------------+
| ConcreteCommandA  |      | ConcreteCommandB  |
+-------------------+      +-------------------+
         |                             |
         +-----------------------------+
                       |
                 +-------------+
                 |  Receiver   |
                 +-------------+

五、Java 实现代码示例

1. 抽象命令接口

java 复制代码
public interface Command {
    void execute();
}

2. 接收者(Receiver)

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

3. 具体命令(ConcreteCommand)

java 复制代码
public class LightOnCommand implements Command {
    private Light light;
    public LightOnCommand(Light light) {
        this.light = light;
    }
    @Override
    public void execute() {
        light.turnOn();
    }
}

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

4. 调用者(Invoker)

java 复制代码
public class RemoteControl {
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    }
    public void pressButton() {
        command.execute();
    }
}

5. 客户端(Client)

java 复制代码
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、事务、任务队列等场景。掌握命令模式有助于编写灵活、可扩展的代码结构。

建议:

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

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

相关推荐
on the way 1234 小时前
创建型设计模式之Prototype(原型)
设计模式·原型模式
Echo``11 小时前
8:OpenCV—仿射变换和坐标映射
开发语言·图像处理·人工智能·qt·opencv·计算机视觉·命令模式
琢磨先生David13 小时前
Java 可扩展状态系统设计:备忘录模式的工程化实践与架构演进
java·设计模式·架构
琢磨先生David15 小时前
Java 迭代器模式:遍历数据集合的优雅之道
java·设计模式·迭代器模式
秋田君18 小时前
深入理解JavaScript设计模式之call,apply,this
javascript·设计模式
master-dragon20 小时前
设计模式-单例模式
java·单例模式·设计模式
hstar952720 小时前
三十一、面向对象底层逻辑-SpringMVC九大组件之RequestToViewNameTranslator接口设计哲学
java·spring·设计模式·架构
张萌杰21 小时前
设计模式26——解释器模式
设计模式·解释器模式
蔡蓝1 天前
设计模式-依赖倒转原则
设计模式
{⌐■_■}1 天前
【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结
开发语言·redis·后端·设计模式·golang·简单工厂模式·抽象工厂模式