Java命令模式
1.概述
命令模式是一种行为型设计模式,它将请求封装为一个对象,从而使用户能够用不同的请求参数来进行参数化和传递方法调用。命令模式允许将操作请求的发送者和接收者解耦,即请求发起者并不需要知道请求的具体执行过程是如何完成的,只需要知道接收者可以执行该命令。
2.模式结构
- 命令(Command):抽象命令类,定义了命令的接口。
- 具体命令(ConcreteCommand):实现了命令接口,定义了具体命令的执行逻辑。
- 命令接收者(Receiver):接收者执行命令的逻辑实现。
- 命令调用者(Invoker):负责调用命令并执行相应的逻辑。
- 客户端(Client):创建具体的命令,调用者调用命令并执行。
3.代码示例
3.1 命令接口(Command)
public interface Command {
void execute();
}
3.2 具体命令(ConcreteCommand)
public class LightOnCommand implements Command {
private LightRecevier light;
public LightOnCommand(LightRecevier light) {
this.light = light;
}
@Override
public void execute() {
light.on();
}
}
public class LightOffCommand implements Command {
private LightRecevier light;
public LightOffCommand(LightRecevier light) {
this.light = light;
}
@Override
public void execute() {
light.off();
}
}
3.3 命令接收者(Receiver)
public class LightRecevier {
public void on() {
System.out.println("灯打开了");
}
public void off() {
System.out.println("灯关闭了");
}
}
3.4 命令调用者(Invoker)
public class SimpleInvoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
3.5 客户端(Client)
public class Client {
public static void main(String[] args) {
// 创建接收者对象
LightRecevier light = new LightRecevier();
// 创建具体命令对象
LightOnCommand lightOnCommand = new LightOnCommand(light);
LightOffCommand lightOffCommand = new LightOffCommand(light);
// 创建调用者对象
SimpleInvoker invoker = new SimpleInvoker();
// 设置具体命令对象
invoker.setCommand(lightOnCommand);
invoker.executeCommand();
invoker.setCommand(lightOffCommand);
invoker.executeCommand();
}
}
4.优缺点说明
4.1 优点
- 支持撤销和重做操作。
- 容易扩展新的命令或者一组命令。
- 很容易将单个命令放在队列中启用。
- 使用命令模式可以使客户端代码与具体执行操作的类解耦。
4.2 缺点
- 会导致某些系统有过多的具体命令类。
- 可能这样做会增加系统的复杂性,因为需要新的代码来管理命令关系。
5.适用场景
- 当需要将发出请求的对象与执行请求的对象解耦时。
- 当需要在不同的时间指定、排列和执行请求时。
- 当需要支持撤销、重做和恢复操作时。
- 当需要将一组操作组合在一起,形成一个类似于面板的操作时。