Head First 设计模式(6)命令模式
2021-07-13 本文已影响0人
kaiker
1、本章的例子——遥控器
遥控器需要操作非常多硬件遥控器上有on off undo的按钮,希望遥控器可以通过按钮操控不同的产品
需要有一种模式,将发出请求的对象和执行请求的对象分离开
public interface Command {
public void execute();
}
// 所有的动作变为类,实现统一的接口,将类的对象提供给给执行者,执行者调用接口中统一的方法,就达到解耦的目的。
public class LightOnCommond implements Commond {
Light light;
public LightOnCommond(Light light) {
this.light = light;
}
public void execute() {
light.on();
}
}
public class SimpleRemoteControl {
Command slot;
public SimpleRemoteControl() {}
public void setCommand(Command command) {
this.slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
2、命令模式
命令模式类图将请求封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。
- light = Receview
- LigntOnCommand = ConcreteCommand
3、例子继续——取消以及带有状态的命令
public interface Command {
public void execute();
public void undo();
}
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {this.light = light}
public void undo() {light.off();}
}
遥控器支持undo
如果命令存在状态,则多使用一个状态进行记录
宏命令,一次进行多个操作。
public class MacroCommand implments Command {
Command[] commands;
public MacroCommand(Command[] commands) {this.commands = commands;}
public void execute() {
for (int i = 0; i < commands.length; i++) {commands[i].execute();}
}
}
当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。