跳到主要内容

命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象,并且能够支持可撤销的操作。

命令模式主要包含以下几个角色:

  1. 命令(Command): 定义了一个抽象接口,用于封装具体命令的执行。

  2. 具体命令(Concrete Command): 实现了命令接口,负责具体命令的执行。

  3. 调用者(Invoker): 请求的发送者,负责调用命令对象执行请求。

  4. 接收者(Receiver): 知道如何执行一个请求相关的操作,实现了实际的业务逻辑。

以下是一个简单的 JavaScript 示例,演示了命令模式:

// 命令接口
class Command {
execute() {}
}

// 具体命令 - 开灯
class LightOnCommand extends Command {
constructor(light) {
super();
this.light = light;
}

execute() {
this.light.turnOn();
}
}

// 具体命令 - 关灯
class LightOffCommand extends Command {
constructor(light) {
super();
this.light = light;
}

execute() {
this.light.turnOff();
}
}

// 接收者
class Light {
turnOn() {
console.log('Light is ON');
}

turnOff() {
console.log('Light is OFF');
}
}

// 调用者
class RemoteControl {
constructor() {
this.command = null;
}

setCommand(command) {
this.command = command;
}

pressButton() {
this.command.execute();
}
}

// 客户端代码
const light = new Light();
const lightOnCommand = new LightOnCommand(light);
const lightOffCommand = new LightOffCommand(light);

const remote = new RemoteControl();

remote.setCommand(lightOnCommand);
remote.pressButton();
// Output: Light is ON

remote.setCommand(lightOffCommand);
remote.pressButton();
// Output: Light is OFF

在这个例子中,Command 是命令接口,LightOnCommandLightOffCommand 是具体命令,Light 是接收者,负责实际执行业务逻辑。RemoteControl 是调用者,它可以设置不同的命令,并通过调用 pressButton 方法执行这些命令。

命令模式的优点包括:

  • 解耦调用者和接收者: 调用者无需知道接收者的实际实现,只需要知道如何调用命令。
  • 可扩展性: 可以方便地添加新的命令类,而不影响其他部分的代码。
  • 支持撤销和恢复: 可以保存命令的历史记录,从而支持撤销和恢复操作。

命令模式适用于需要将请求发送者和接收者解耦的场景,以及需要支持撤销、恢复等操作的场景。