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

发布于:2025-05-28 ⋅ 阅读:(23) ⋅ 点赞:(0)

下面是一篇关于设计模式之命令模式(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;
    }
    @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)

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

建议:

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

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


网站公告

今日签到

点亮在社区的每一天
去签到