-
(1) 命令模式可以将__方法调用__封装起来
(2) 命令模式将__动作的请求者__ 从 __动作的执行者__对象中解耦
示例
动作的请求者:人
动作的执行者:灯
中间引入了一层__命令__,使得人和灯解耦,人只需要控制这些命令即可(类似遥控器)
-
所有的命令对象实现相同的命令接口, 用来执行和撤销命令
public interface Command { void execute(); void undo(); }
-
具体的命令实现类在构造函数中传入动作的接收者
public class LightOnCommand implements Command { private final Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.on(); } public void undo() { light.off(); } }
在LightOnCommand命令对象中, 动作的接收者是Light
Light.java
public class Light { ... public void on() { System.out.println("Light is on"); } public void off() { System.out.println("Light is off"); } ... }
在动作的请求者对象中, 只需传入命令对象, 无需传入动作的接收者对象, 这样就实现了动作的请求者和动作的接收者的解耦
RemoteControl.java
public class RemoteControl { private Command onCommand; private Command offCommand; public RemoteControl() { onCommands = new NoCommand(); offCommands = new NoCommand(); } public void setCommand(Command onCommand, Command offCommand) { this.onCommand = onCommand; this.offCommand = offCommand; } public void onButtonWasPushed() { onCommand.execute(); } public void offButtonWasPushed() { offCommand.execute(); } ... }
-
命令模式
将命令封装成对象, 以便使用不同的请求、队列或日志来参数化其他对象
-
利用命令模式实现撤销操作
请求调用者内部封装一条undoCommand命令, 每次调用命令时更新
-
命令模式的实际用途
(1) 线程池和Callable
(2) 日志系统