命令模式-Command Pattern
什么是命令模式
命令模式是一种行为类设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。
命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。
优点和应用场景
优点:
- 解耦请求发送者和接受者,让系统更加灵活、可扩展
- 由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。
命令模式典型的应用场景:
- 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
- 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦
抽象命令
package test.pattern;
public interface Command {
void execute();
}
具体命令
package test.pattern;
public class TurnOffCommand implements Command {
private Device device;
public TurnOffCommand(Device device) {
this.device = device;
}
public void execute() {
device.turnOff();
}
}
package test.pattern;
public class TurnOnCommand implements Command {
private Device device;
public TurnOnCommand(Device device) {
this.device = device;
}
public void execute() {
device.turnOn();
}
}
接收者
package test.pattern;
public class Device {
private String name;
public Device(String name) {
this.name = name;
}
public void turnOn() {
System.out.println(name + " 设备打开");
}
public void turnOff() {
System.out.println(name + " 设备关闭");
}
}
调用者
package test.pattern;
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
测试
package test.pattern;
public class Client {
public static void main(String[] args) {
// 创建接收者对象
Device tv = new Device("TV");
Device stereo = new Device("Stereo");
// 创建具体命令对象,可以绑定不同设备
TurnOnCommand turnOn = new TurnOnCommand(tv);
TurnOffCommand turnOff = new TurnOffCommand(stereo);
// 创建调用者
RemoteControl remote = new RemoteControl();
// 执行命令
remote.setCommand(turnOn);
remote.pressButton();
remote.setCommand(turnOff);
remote.pressButton();
}
}