Java命令模式分析
命令模式是一种行为型设计模式,它将请求封装为独立对象,实现请求发送者与接收者的解耦。以下是核心分析:
核心结构
-
命令接口(Command)
声明执行操作的通用方法:
javapublic interface Command { void execute(); }
-
具体命令(ConcreteCommand)
实现命令接口,关联接收者对象:
javapublic class LightOnCommand implements Command { private Light light; // 接收者对象 public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.turnOn(); // 调用接收者方法 } }
-
调用者(Invoker)
触发命令执行:
javapublic class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); // 执行命令 } }
-
接收者(Receiver)
实际执行操作的对象:
javapublic class Light { public void turnOn() { System.out.println("Light is ON"); } }
优势分析
- 解耦性:调用者无需知道接收者细节
- 可扩展性:新增命令不影响现有结构
- 复合命令:支持宏命令(命令组合)
- 撤销/重做:通过记录命令历史实现
适用场景
- 需要回调机制的系统
- 需要实现操作队列的场景
- 需要支持事务/撤销的操作
- GUI事件处理(如按钮点击)
代码示例
java
// 客户端使用
public class Client {
public static void main(String[] args) {
Light light = new Light(); // 接收者
Command lightOn = new LightOnCommand(light);
RemoteControl remote = new RemoteControl(); // 调用者
remote.setCommand(lightOn);
remote.pressButton(); // 输出: Light is ON
}
}
模式变体
-
带状态命令 :增加
unexecute()
实现撤销 -
组合命令 :实现命令批处理
javapublic class MacroCommand implements Command { private List<Command> commands = new ArrayList<>(); public void add(Command cmd) { commands.add(cmd); } @Override public void execute() { commands.forEach(Command::execute); } }
该模式通过将操作请求对象化,实现了调用操作与具体实现的分离,符合开闭原则,是GUI框架和事务系统的核心设计范式。