第6章:命令模式(Command Pattern)
一、导读
1.1 本章学习目标
第6章讲解命令模式——将请求封装为对象,从而支持参数化、排队、撤销等操作。
1.2 为什么第六章如此重要
命令模式将请求的发送者和接收者解耦,支持撤销、重做、日志记录等功能。
1.3 核心问题引导
命令模式如何封装请求?
如何实现撤销操作?
宏命令是什么?
命令模式在哪些场景中应用?
二、核心概念详解
6.1 命令模式结构
java
// 命令接口
public interface Command {
void execute();
void undo();
}
// 具体命令
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) { this.light = light; }
public void execute() { light.on(); }
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(); }
}
// 使用
Light light = new Light();
Command lightOn = new LightOnCommand(light);
RemoteControl remote = new RemoteControl();
remote.setCommand(lightOn);
remote.pressButton(); // 灯亮
remote.pressUndo(); // 灯灭6.2 宏命令
java
public class MacroCommand implements Command {
private List<Command> commands;
public MacroCommand(List<Command> commands) {
this.commands = commands;
}
public void execute() {
commands.forEach(Command::execute);
}
public void undo() {
// 逆序撤销
for (int i = commands.size() - 1; i >= 0; i--) {
commands.get(i).undo();
}
}
}三、实战案例
3.1 文本编辑器撤销
java
public class TextEditor {
private StringBuilder text = new StringBuilder();
private Deque<Command> history = new ArrayDeque<>();
public void type(String chars) {
Command cmd = new TypeCommand(text, chars);
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) {
history.pop().undo();
}
}
}四、本章小结
命令模式将请求封装为对象,支持撤销、重做、排队。宏命令可以批量执行命令。
五、思考与练习
命令模式和策略模式有什么区别?
如何实现多级撤销?
命令模式如何用于事务处理?
Lambda 表达式如何简化命令模式?
命令模式在 GUI 中如何应用?