「这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战」。
一、什么是命令模式
命令模式:将一个请求封装为一个对象,将请求的发起者和请求的接收者分开,通过命令进行对象的操作。举个栗子:我们使用遥控器打开空调,遥控器就是命令的发起者,空调就是命令的接收者,遥控器上的各个按钮就是不同的命令,就像我们打开空调使用的使电源键,而不是其它的按钮。遥控器和空调之间是分开的,它们是通过命令完成了打开空调的操作。通过请求发起者与接收者之间分开,降低了系统之间的耦合性。
二、命令模式的实现
public interface Command {
void execute();
}
抽象的命令,相当于遥控器打开空调中的按钮
/**
* 命令的具体接收者
*/
public class OpenAirConditioner {
public void open() {
System.out.println("打开空调!");
}
}
命令的具体接收者,执行打开空调的操作。
public class AdjustAirConditioner {
public void adjustTemperature() {
System.out.println("调节空调温度!");
}
}
命令的具体接收者,执行调节温度的操作
public class OpenCommand implements Command {
private final OpenAirConditioner openAirConditioner;
public OpenCommand(OpenAirConditioner openAirConditioner) {
this.openAirConditioner = openAirConditioner;
}
@Override
public void execute() {
openAirConditioner.open();
}
}
具体命令,打开空调命令
public class AdjustCommand implements Command {
private AdjustAirConditioner adjustAirConditioner;
public AdjustCommand(AdjustAirConditioner adjustAirConditioner) {
this.adjustAirConditioner = adjustAirConditioner;
}
@Override
public void execute() {
adjustAirConditioner.adjustTemperature();
}
}
具体命令,调节温度
public class RemoteControl {
private OpenCommand openConmmand;
private AdjustCommand adjustCommand;
public RemoteControl(OpenCommand openConmmand, AdjustCommand adjustCommand) {
this.openConmmand = openConmmand;
this.adjustCommand = adjustCommand;
}
public void open(){
openConmmand.execute();
}
public void adjustTeperature(){
adjustCommand.execute();
}
}
调用者,相当于遥控器打开空调中的遥控器
public static void main(String[] args) {
OpenAirConditioner openAirConditioner = new OpenAirConditioner();
AdjustAirConditioner adjustAirConditioner = new AdjustAirConditioner();
Command openCommand = new OpenCommand(openAirConditioner);
Command adjustCommand = new AdjustCommand(adjustAirConditioner);
openCommand.execute();
adjustCommand.execute();
}
客户端通过调用调用者的接口,执行命令,最后由接收者完成。
三、总结
命令模式的角色:
- command:抽象命令类角色,用于声明执行命令。
- concreate command:具体命令类,实现抽象命令角色,并且调用接收者完成操作。
- receiver:接收者角色,具体的命令执行者。
- invoker:调用者,通常拥有很多命令,通过调用不同的命令发起请求。
命令模式可以和组合模式一起实现组合命令模式(宏命令模式),也可以和备忘录模式组合实现命令的撤销与恢复。
优点:通过引入命令的方式降低了耦合度。
缺点:如果命令很多,可能会有很多命令类。同时由于命令的映入,增加了系统的复杂性,使得系统变得更难以理解。