本文介绍23种设计模式之命令模式。
定义
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
描述
- 模式名称:COMMAND(命令)
- 类型:对象行为型模式
- 意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
- 适用性:
- 抽象出待执行的动作以参数化某对象。
- 效果:
- 优点:
- 将调用操作的对象与知道如何实现该操作的对象解耦。
- 可扩展性强。
- 缺点:
- 可能会导致某些系统有过多的具体命令类,增加系统的复杂性。
类图
- Client:客户端复制创建一个ConcreteCommand,并设置接收者和调用者。
- Invoker:调用者持有命令对象,并且调用命令对象的excute方法。
- Command:所有命令的接口,包含excute()方法和undo()
- ConcreteCommand:具体命令类,定义了操作和接收者之间的关系。
- Receiver:接收者,就是命令操作的对象。
实现代码
Invoker
public class Invoker {
private List<Command> commands;
public Invoker() {
commands = new ArrayList<>();
}
public void setCommand(Command command) {
commands.add(command);
}
public void excute(){
System.out.println("执行所有命令");
commands.forEach(command -> {
command.excute();
});
}
}
Command
public interface Command {
void excute();
void undo();
}
ConcreteCommand
public class ConcreteCommand implements Command {
private Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void excute() {
receiver.action();
}
@Override
public void undo() {
receiver.off();
}
}
Receiver
public class Receiver {
public void action(){
System.out.println("调用receiver的action方法");
}
public void off(){
System.out.println("调用receiver的off方法");
}
}