设计模式-命令模式
命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,队列化请求或者记录请求日志,以及支持可撤销的操作。在命令模式中,一个请求(命令)被封装为一个对象,该对象负责调用接收者对象的某个方法来执行请求。
下面是一个简单的命令模式实现示例,包括命令接口、具体命令类、接收者类和调用者(Invoker)类。
1. 命令接口 (`Command`)
public interface Command {
void execute();
}
2. 具体命令类 (`LightOnCommand` 和 `LightOffCommand`)
public class LightOnCommand implements Command {
private final Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
public class LightOffCommand implements Command {
private final Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
3. 接收者类 (`Light`)
public class Light {
public void turnOn() {
System.out.println("Light is on");
}
public void turnOff() {
System.out.println("Light is off");
}
}
4. 调用者类 (`RemoteControl`)
public class RemoteControl {
private Command slot;
public void setCommand(Command command) {
this.slot = command;
}
public void buttonWasPressed() {
slot.execute();
}
}
5. 使用示例
public class Main {
public static void main(String[] args) {
Light light = new Light();
Command lightOn = new LightOnCommand(light);
Command lightOff = new LightOffCommand(light);
RemoteControl remoteControl = new RemoteControl();
remoteControl.setCommand(lightOn);
remoteControl.buttonWasPressed();
remoteControl.setCommand(lightOff);
remoteControl.buttonWasPressed();
}
}
命令模式是一种强大的设计模式,特别适用于需要支持多个操作请求、队列请求、日志记录或撤销操作的场景。通过将请求封装成命令对象,它提供了高度的灵活性和扩展性,同时也保持了系统的松耦合。然而,使用时需权衡其带来的系统复杂度增加是否符合项目需求。
6. 优点
- 松耦合:命令模式将发出请求的对象与执行请求的对象解耦,使得两者之间没有直接引用。
- 扩展性好:容易添加新的命令或新的接收者,符合开闭原则。
- 易于管理:可以轻松地将命令放入队列、记录日志或支持撤销操作。
7. 缺点
- 增加系统复杂性:引入了大量的命令和接收者类,对于简单的情况可能显得冗余。
- 可能难以理解:初学者可能会觉得命令模式的概念和结构较为复杂。