命令模式 (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、消息监听等机制都使用了命令模式的思想。