跳到主要内容

命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而允许您参数化客户端对象以传递不同的请求、排队请求或记录请求日志,以及支持可撤销的操作。命令模式的目标是将请求发送者和请求接收者解耦,并提供更大的灵活性和可扩展性。

命令模式的核心思想是将请求封装为一个命令对象,这个对象包含执行请求所需的方法和参数。请求发送者将命令对象传递给请求接收者,并请求接收者执行命令。这使得可以轻松实现命令的排队、撤销、重做和日志记录等功能。

场景

用户界面操作:命令模式常用于构建用户界面,以处理按钮点击、菜单选择等用户操作。

队列请求:命令模式可以用于实现请求排队,例如在打印队列中。

远程控制:命令模式可用于实现远程控制,允许一个系统通过命令对象来控制另一个系统。

日志和撤销功能:命令模式可以用于记录操作日志,以支持撤销和重做操作。

实现

// 命令接口
class Command {
execute() {
throw new Error("Execute method must be overridden");
}
}

// 具体命令,开灯
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 remoteControl = new RemoteControl();

remoteControl.setCommand(lightOnCommand);
remoteControl.pressButton();

remoteControl.setCommand(lightOffCommand);
remoteControl.pressButton();

在上面的示例中,Command 是命令接口,它包含一个 execute 方法,用于执行命令。LightOnCommand 和 LightOffCommand 是具体命令,它们执行打开和关闭电灯的操作。Light 是电灯对象,它包含了实际的操作。RemoteControl 是请求发送者,它用于设置和执行命令。

命令模式允许您将请求发送者和请求接收者解耦,从而可以轻松扩展和修改系统。此模式还支持排队和记录命令,以支持撤销和重做功能,以及记录操作日志。命令模式在许多应用程序中都有广泛的应用,特别是在构建用户界面和处理用户交互时。