3.2 命令模式
命令模式(Command)把一个请求封装成一个对象。这听起来抽象,但一旦“做某件事”变成了可以传递、存储、排队的对象,你就解锁了一系列强大能力:撤销/重做、操作日志、宏命令、任务队列、事务。
可编程遥控器是经典隐喻:按钮不直接“开灯”,它只是持有一个 Command,按下就 execute()。同一个按钮可以被重新绑定到任何命令。
正在加载交互实验...
四个角色
java
interface Command { void execute(); }
class LightOnCommand implements Command {
private Light light; // 接收者
public void execute() { light.on(); }
}
// 调用者只认识 Command 接口
class Button {
private Command command;
void press() { command.execute(); }
}- 命令(Command):封装动作的接口。
- 具体命令:绑定接收者并实现
execute()。
- 接收者(Receiver):真正干活的对象(如
Light)。
- 调用者(Invoker):触发命令的对象(如
Button),它只认识接口。
正在加载概念检查...
撤销:命令模式的杀手锏
给命令再加一个 undo(),把执行过的命令压入历史栈,你就有了撤销/重做。下面的实验让你执行 +1/+5 操作,然后一步步撤销、重做,观察两个栈如何流动。
正在加载交互实验...
正在加载概念检查...
它还能做什么
- 宏命令:把一组命令组合成一个,一次执行(“一键离家”关灯关空调锁门)。
- 任务队列:命令对象可被序列化、入队、异步执行——这正是消息队列里 Job 的本质。
- 事务与回放:记录命令序列,可重放或回滚。
命令模式的代价是“为每个动作写一个类”,所以只在你确实需要这些能力时才引入;否则直接调用方法更简单。
正在加载本节练习...