将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
优点:
- 降低系统的耦合度,请求发送者和接收者之间没有直接的联系,请求发送者只需要知道如何发送请求,而不需要知道请求的处理细节。
- 可以方便地设计一个命令队列或宏命令(组合命令)。
- 可以方便地实现对请求的撤销和重做。
- 可以方便地将命令记入日志。
- 可以方便地实现对请求的延时执行和预约执行。
缺点:
- 使用命令模式可能会导致某些系统有过多的具体命令类。
- 系统的复杂性会增加。
应用场景:
- GUI 中菜单的设计,一个菜单项对应一个命令,菜单项的点击相当于调用命令的 execute() 方法。
- 模拟 CMD。
- 模拟多级撤销和重做操作。
- 模拟宏命令。
// 定义命令接口
class Command {
execute() {}
undo() {}
}
// 定义具体命令类
class ConcreteCommand extends Command {
constructor(receiver) {
super();
this.receiver = receiver;
}
execute() {
this.receiver.action();
}
undo() {
this.receiver.undoAction();
}
}
// 定义接收者类
class Receiver {
action() {
console.log('执行操作');
}
undoAction() {
console.log('撤销操作');
}
}
// 定义请求者类
class Invoker {
constructor(command) {
this.command = command;
}
setCommand(command) {
this.command = command;
}
executeCommand() {
this.command*ex.e**cute();
}
undoCommand() {
this.command.undo();
}
}
// 使用
const receiver = new Receiver();
const command = new ConcreteCommand(receiver);
const invoker = new Invoker(command);
invoker*ex.e**cuteCommand(); // 执行操作
invoker.undoCommand(); // 撤销操作