命令模式学习笔记
什么是命令模式?
命令模式是一种行为设计模式,通过将请求封装成一个对象来解耦发送者和接受者。该模式允许将命令的不同实现方式(如撤销、重做、宏命令等)与命令本身分离开来,从而使命令更加灵活。
命令对象的组成部分
接收者(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灯已打开 灯已关闭