命令模式
命令模式(Command Pattern)是行为型设计模式之一,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,以及对请求排队或记录请求日志等操作。通过使用命令模式,命令的发出者与命令的执行者可以完全解耦。
命令模式的结构
- Command(命令接口/抽象类):定义了执行命令的方法,例如
execute()
。 - ConcreteCommand(具体命令类):实现了
Command
接口,具体实现了命令的执行逻辑。通常会持有对接收者对象的引用,并在execute()
方法中调用接收者的相关操作。 - Receiver(接收者类):执行与请求相关的操作。每个具体命令将接收者对象的动作封装为命令。
- Invoker(调用者类):持有命令对象,并在某个时间点触发命令的执行。调用者通常不直接与接收者交互,而是通过命令对象来完成具体的操作。
- Client(客户端):创建命令对象并设定其接收者。客户端可以通过调用者来触发命令的执行。
示例
举个简单的例子,假设有一个遥控器可以控制灯的开关:
// Command接口
public interface Command {
void execute();
}
// Receiver 接收者类
public class Light {
public void turnOn() {
System.out.println("Light is ON");
}
public void turnOff() {
System.out.println("Light is OFF");
}
}
// 具体命令类 - 打开灯
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
// 具体命令类 - 关闭灯
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
// Invoker 调用者类
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
if (command != null) {
command.execute();
}
}
}
// Client 客户端代码
public class Client {
public static void main(String[] args) {
Light light = new Light(); // 创建接收者对象
// 创建命令对象
Command lightOn = new LightOnCommand(light);
Command lightOff = new LightOffCommand(light);
RemoteControl remote = new RemoteControl(); // 创建调用者对象
// 打开灯
remote.setCommand(lightOn);
remote.pressButton();
// 关闭灯
remote.setCommand(lightOff);
remote.pressButton();
}
}
代码说明
- 命令接口 (Command):定义了一个
execute()
方法,所有命令都要实现这个接口。 - 接收者 (Light):包含实际执行操作的方法,比如
turnOn()
和turnOff()
。 - 具体命令类 (LightOnCommand, LightOffCommand):每个具体命令类实现
Command
接口,并持有对接收者对象的引用。在execute()
方法中调用接收者的具体操作。 - 调用者 (RemoteControl):调用者不直接与接收者交互,而是通过命令对象来间接操作。它持有命令对象,并在适当的时候调用
execute()
方法。 - 客户端 (Client):负责创建接收者、具体命令对象,并将命令对象传递给调用者。
命令模式的扩展
1. 撤销操作
要实现撤销操作,可以在命令类中增加undo()
方法,并记录上一次执行的状态。例如:
java复制代码public interface Command {
void execute();
void undo(); // 撤销操作
}
在具体命令类中实现undo()
方法:
public class LightOnCommand implements Command {
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
@Override
public void undo() {
light.turnOff();
}
}
2. 宏命令
宏命令是一组命令的组合,可以一次性执行多个命令。可以创建一个MacroCommand
类来存储并执行多个命令:
import java.util.ArrayList;
import java.util.List;
public class MacroCommand implements Command {
private List<Command> commands = new ArrayList<>();
public void addCommand(Command command) {
commands.add(command);
}
@Override
public void execute() {
for (Command command : commands) {
command.execute();
}
}
@Override
public void undo() {
for (Command command : commands) {
command.undo();
}
}
}
标签:execute,light,void,模式,命令,Command,public
From: https://www.cnblogs.com/20lxj666/p/18396294