第二十一章 命令模式
命令模式(Command Pattern)是一种行为设计模式,其目的是将请求封装成对象,以便参数化其他对象,并在不同的请求、队列或者日志中对请求参数化和传递。它允许将客户端与接收者对象解耦。
以下是命令模式的一些关键角色:
命令(Command): 定义了执行操作的接口,通常包括
execute
方法。具体命令(ConcreteCommand): 实现了命令接口,持有执行命令所需的具体操作。
调用者(Invoker): 负责调用命令对象执行请求,它不直接执行操作,而是通过命令对象委托给具体的接收者。
接收者(Receiver): 知道如何实施与执行一个请求相关的操作。
客户端(Client): 创建命令对象并设置其接收者。
下面是一个简单的命令模式的示例,以一个遥控器控制家电设备为例:
// 1. 命令接口
interface Command {
void execute();
}
// 2. 具体的命令:开灯
class LightOnCommand implements Command {
private Light light;
LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
// 3. 接收者:电灯
class Light {
void turnOn() {
System.out.println("Light is ON");
}
}
// 4. 调用者:控制中心
class RemoteControl {
private Command command;
//设置遥控命令
void setCommand(Command command) {
this.command = command;
}
void pressButton() {
command.execute();
}
}
// 5. 客户端
public class CommandPatternExample {
public static void main(String[] args) {
Light light = new Light();
LightOnCommand lightOnCommand = new LightOnCommand(light);
RemoteControl remoteControl = new RemoteControl();
//设置遥控命令
remoteControl.setCommand(lightOnCommand);
remoteControl.pressButton();
}
}
在这个例子中,Command
接口定义了 execute
方法。LightOnCommand
类实现了这个接口,持有一个 Light
对象,并在 execute
方法中调用 Light
的 turnOn
方法。Light
类是接收者,它知道如何执行打开灯的操作。RemoteControl
类是调用者,它通过 setCommand
方法设置具体的命令,并通过 pressButton
方法调用命令的 execute
方法,从而触发灯的打开操作。
这个例子展示了命令模式的基本结构,并且在实际应用中,可以通过添加新的命令类轻松地扩展系统。