命令模式学习笔记

什么是命令模式?

命令模式是一种行为设计模式,通过将请求封装成一个对象来解耦发送者和接受者。该模式允许将命令的不同实现方式(如撤销、重做、宏命令等)与命令本身分离开来,从而使命令更加灵活。

命令对象的组成部分

接收者(Receiver)

接收者是命令的执行者。它知道如何实现命令所要求的任何操作。

命令接口(Command Interface)

命令接口定义了命令应该具有的通用方法,如执行和撤销命令。

具体命令(Concrete Command)

具体命令是实现命令接口的具体类。它通过将一个或多个操作绑定到接收者而在接收者上实现命令。

发送者(Invoker)

发送者是将命令发送给接收者的对象。它只知道如何将命令传递给接收者,而不知道命令执行的细节。

客户端(Client)

客户端是创建命令并将其发送给发送者的对象。

实例

示例代码(Java)

javaCopy Code
// Receiver class Light { public void turnOn() { System.out.println("灯已打开"); } public void turnOff() { System.out.println("灯已关闭"); } } // Command Interface interface Command { void execute(); void undo(); } // Concrete Command class TurnOnLightCommand implements Command { private final Light light; public TurnOnLightCommand(Light light) { this.light = light; } public void execute() { light.turnOn(); } public void undo() { light.turnOff(); } } // Invoker class RemoteController { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); } public void pressUndo() { command.undo(); } } // Client public class Client { public static void main(String[] args) { Light light = new Light(); Command turnOnCommand = new TurnOnLightCommand(light); RemoteController remoteController = new RemoteController(); remoteController.setCommand(turnOnCommand); remoteController.pressButton(); remoteController.pressUndo(); } }

示例说明

本例中,我们模拟了一个遥控器控制灯的场景。

  • Light 类充当接收者,它知道如何打开或关闭灯。
  • Command 接口定义了命令的通用方法:execute()undo(),分别用于执行和撤销命令。所有具体命令都必须实现此接口。
  • TurnOnLightCommand 类是具体命令的实现之一,它通过将 Light 对象绑定到命令上来实现打开灯的操作。
  • RemoteController 类是发送者,它只知道如何向命令对象发送请求。客户端可以通过调用 setCommand() 方法将具体命令设置到遥控器上,并使用 pressButton() 方法执行命令。
  • 在本例中,客户端创建了一个 Light 对象、一个 TurnOnLightCommand 对象和一个 RemoteController 对象,并将 TurnOnLightCommand 对象设置到遥控器上。最后客户端通过调用 pressButton() 方法来执行命令。

运行代码可以得到如下输出:

Copy Code
灯已打开 灯已关闭