目录

命令模式 (Command Pattern)

将请求封装为对象,支持撤销、队列和日志记录

概述

命令模式是一种行为型设计模式,它将请求封装成对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式也支持可撤销的操作。

适用场景

  • 需要参数化对象
  • 支持撤销/重做功能
  • 实现操作队列或日志
  • 支持事务

基础实现

// 命令接口
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 Light light;
    
    public LightOnCommand(Light light) {
        this.light = light;
    }
    
    @Override
    public void execute() {
        light.on();
    }
    
    @Override
    public void undo() {
        light.off();
    }
}

// 调用者
public class RemoteControl {
    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void pressButton() {
        command.execute();
    }
    
    public void pressUndo() {
        command.undo();
    }
}

// 使用
RemoteControl remote = new RemoteControl();
Light light = new Light();

remote.setCommand(new LightOnCommand(light));
remote.pressButton();  // 开灯
remote.pressUndo();    // 撤销关灯

框架中的应用

Runnable / Callable

// Java 的 Runnable 就是命令模式
ExecutorService executor = Executors.newFixedThreadPool(4);

Runnable command = () -> {
    System.out.println("执行任务");
};

executor.submit(command);

Spring Event

@Component
public class OrderMessageListener {
    @JmsListener(destination = "order.queue")
    public void onMessage(OrderMessage message) {
        processOrder(message);
    }
}

优缺点

优点缺点
解耦调用者和接收者类数量增加
支持撤销/重做系统复杂度提高
支持队列和日志

总结

命令模式是解耦请求发送者和接收者的有效方式。在需要支持撤销、队列、日志等功能的场景下非常适用。Spring 的 @Async、消息监听等机制都使用了命令模式的思想。