跳到主要内容

TypeScript 命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录日志以及撤销操作。命令模式的核心思想是将“做什么”与“谁来做”解耦,使得请求的发送者和接收者之间没有直接的依赖关系。

命令模式的基本结构

命令模式通常包含以下几个角色:

  1. 命令接口(Command Interface):定义了执行操作的接口。
  2. 具体命令(Concrete Command):实现了命令接口,封装了具体的操作。
  3. 接收者(Receiver):知道如何执行与请求相关的操作。
  4. 调用者(Invoker):持有命令对象,并在某个时间点调用命令对象的执行方法。
  5. 客户端(Client):创建命令对象并设置其接收者。

代码示例

让我们通过一个简单的例子来理解命令模式。假设我们有一个遥控器,它可以控制电灯的开关。我们将使用命令模式来实现这个功能。

1. 定义命令接口

首先,我们定义一个命令接口 Command,它包含一个 execute 方法。

typescript
interface Command {
execute(): void;
}

2. 创建具体命令

接下来,我们创建两个具体命令 LightOnCommandLightOffCommand,分别用于打开和关闭电灯。

typescript
class Light {
turnOn(): void {
console.log("Light is on");
}

turnOff(): void {
console.log("Light is off");
}
}

class LightOnCommand implements Command {
private light: Light;

constructor(light: Light) {
this.light = light;
}

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

class LightOffCommand implements Command {
private light: Light;

constructor(light: Light) {
this.light = light;
}

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

3. 创建调用者

调用者 RemoteControl 持有一个命令对象,并在需要时调用其 execute 方法。

typescript
class RemoteControl {
private command: Command;

setCommand(command: Command): void {
this.command = command;
}

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

4. 客户端代码

最后,客户端代码创建命令对象并设置其接收者,然后将命令对象传递给调用者。

typescript
const light = new Light();
const lightOnCommand = new LightOnCommand(light);
const lightOffCommand = new LightOffCommand(light);

const remoteControl = new RemoteControl();

remoteControl.setCommand(lightOnCommand);
remoteControl.pressButton(); // 输出: Light is on

remoteControl.setCommand(lightOffCommand);
remoteControl.pressButton(); // 输出: Light is off

实际应用场景

命令模式在实际开发中有广泛的应用,特别是在需要实现撤销操作、宏命令、任务队列等场景中。例如:

  • 撤销操作:在文本编辑器中,用户执行的每个操作(如插入、删除)都可以封装为一个命令对象,从而实现撤销功能。
  • 任务队列:在任务调度系统中,可以将每个任务封装为一个命令对象,并将其放入队列中依次执行。
  • 宏命令:可以将多个命令组合成一个宏命令,从而实现批量操作。

总结

命令模式通过将请求封装为对象,使得请求的发送者和接收者之间解耦,从而提高了系统的灵活性和可扩展性。它适用于需要实现撤销操作、任务队列、宏命令等场景。

提示

提示:命令模式的一个关键优势是它允许你将操作封装为对象,从而可以轻松地扩展系统功能,例如添加新的命令或实现撤销操作。

附加资源与练习

  • 练习:尝试扩展上面的例子,添加一个 UndoCommand,使得用户可以撤销上一次的操作。
  • 进一步学习:阅读更多关于命令模式的内容,了解如何在更复杂的系统中应用该模式。
警告

注意:虽然命令模式提供了很大的灵活性,但在某些情况下可能会导致类的数量增加,因此在设计时需要权衡利弊。