文章摘要: 命令模式使用总结。
简介
简要说明
- 命令模式(Command Pattern)是一种行为型设计模式。
- 将请求的发送者和接收者解耦,发送者只需要知道如何发送请求,而不必知道请求的具体执行过程。
主要功能
- 将请求封装成对象,允许用户对请求进行参数化。
- 允许将请求对象放入队列中进行排队。
- 支持可撤销的操作。
- 可以添加新的命令类,不需要修改现有代码。
注意事项
- 可能会导致系统中产生大量的命令类,增加了系统的复杂性。
- 使用命令模式可能会导致某些请求的处理速度变慢。
适用场景
- 当需要将发出请求的对象和执行请求的对象解耦时。
- 当需要支持撤销操作时。
- 当需要支持操作的日志记录和事务操作时。
Java 8
案例
// 命令接口,声明执行操作的方法
interface Command {
void execute();
}
// 接收者类,真正执行命令的操作
class Light {
public void turnOn() {
System.out.println("Light is on");
}
public void turnOff() {
System.out.println("Light is off");
}
}
// 具体命令类,实现命令接口,并持有接收者对象
class TurnOnCommand implements Command {
private Light light;
public TurnOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn(); // 调用接收者的方法执行命令
}
}
class TurnOffCommand implements Command {
private Light light;
public TurnOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff(); // 调用接收者的方法执行命令
}
}
// 调用者类,负责调用命令对象执行请求
class RemoteControl {
private Command command;
// 设置命令
public void setCommand(Command command) {
this.command = command;
}
// 执行命令
public void pressButton() {
command.execute();
}
}
// 客户端代码,使用命令模式
public class CommandPatternDemo {
public static void main(String[] args) {
Light light = new Light(); // 创建接收者对象
Command turnOnCommand = new TurnOnCommand(light); // 创建具体命令对象
Command turnOffCommand = new TurnOffCommand(light); // 创建具体命令对象
RemoteControl remoteControl = new RemoteControl(); // 创建调用者对象
remoteControl.setCommand(turnOnCommand); // 设置命令
remoteControl.pressButton(); // 执行命令,开灯
remoteControl.setCommand(turnOffCommand); // 设置命令
remoteControl.pressButton(); // 执行命令,关灯
}
}
注释
- 在这个例子中,
Command接口定义了一个execute方法,它将由具体的命令类实现。Light类是接收者,它包含实际执行操作的代码。TurnOnCommand和TurnOffCommand是具体的命令类,它们实现了Command接口,并持有Light对象。 RemoteControl类是调用者,它持有一个命令对象,并提供了一个方法pressButton来执行命令。- 客户端代码
CommandPatternDemo创建了Light对象,并创建了两个命令对象TurnOnCommand和TurnOffCommand。然后,它创建了一个RemoteControl对象,并通过调用setCommand方法来设置命令,通过调用pressButton方法来执行命令。这样,客户端就可以通过调用者发送命令给接收者,而无需直接与接收者交互。