Java 命令模式(Command Pattern)详解
🧠 什么是命令模式?
命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使你可以使用不同的请求、队列、日志请求以及支持可撤销的操作。
命令模式将请求的发送者和接收者解耦,调用者不再直接操作接收者对象,而是通过命令对象来实现。
🎯 使用场景
- 需要将请求调用者与请求接收者解耦
- 希望支持撤销、重做操作
- 需要支持日志记录和事务处理等功能
🏗️ 模式结构
- Command(命令接口) :声明执行命令的接口,通常有一个
execute()
方法 - ConcreteCommand(具体命令类):实现命令接口,定义具体的执行操作
- Invoker(调用者) :请求命令的对象,调用命令对象的
execute()
方法 - Receiver(接收者):知道如何执行与请求相关的操作,实际执行命令的类
✅ 示例:遥控器控制灯光
命令接口
java
public interface Command {
void execute();
}
具体命令类
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();
}
}
接收者类
java
public class Light {
public void turnOn() {
System.out.println("Light is ON");
}
public void turnOff() {
System.out.println("Light is OFF");
}
}
调用者类
java
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
客户端
java
public class Client {
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(); // 输出:Light is ON
remote.setCommand(lightOff);
remote.pressButton(); // 输出:Light is OFF
}
}
✅ 优点
- 请求发送者和接收者解耦
- 可以灵活地增加或改变命令
- 支持撤销和重做功能
- 可以组合多个命令
⚠️ 缺点
- 增加了类的数量,系统复杂度增加
- 对于简单操作,命令模式的使用可能显得过于复杂
🧩 使用建议
命令模式适合那些需要将请求发起者与请求执行者解耦的场景,尤其是当你需要提供撤销、重做操作或将多个命令封装成一个组合命令时。