1、模式介绍:
命令模式(Command Pattern)是一种行为设计模式,其主要目的是将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。这种模式使得命令的请求者和实现者解耦。
2、应用场景:
需要将请求发送者和接收者解耦:命令模式将请求封装成对象,使得发送者和接收者彼此独立,发送者不需要知道接收者的具体操作。
需要在不同的时间指定请求、排队请求、记录请求:命令模式允许将操作请求封装成对象,从而使得可以参数化其他对象来执行不同的请求、将请求排队、记录日志等。
3、优点:
降低系统耦合度:命令模式将请求者与接收者解耦,请求者无需知道接收者的详细信息。
新增或修改命令更加灵活:可以新增命令类或修改命令参数,而不影响到其他类。
支持撤销和重做操作:通过保存历史命令可以实现撤销和重做操作。
4、缺点:
命令类可能会增加系统复杂度:每一个命令都需要设计一个具体命令类,可能会导致类的数量增加。
可能会导致系统产生大量的具体命令类:如果命令操作很多,可能会产生大量的具体命令类。
5、代码示例:
/**
* 命令接口
*
* @author FM_南风
* @date 2024/7/5
*/
public interface Command {
void execute();
}
/**
* 接收者类 - 灯
*
* @author FM_南风
* @date 2024/7/5
*/
public class Light {
public void turnOn() {
System.out.println("灯已打开");
}
public void turnOff() {
System.out.println("灯已关闭");
}
}
/**
* 具体命令类 - 关灯命令
*
* @author FM_南风
* @date 2024/7/5
*/
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
public void execute() {
light.turnOff();
}
}
/**
* 具体命令类 - 开灯命令
*
* @author FM_南风
* @date 2024/7/5
*/
public class LightOnCommand implements Command{
private Light light;
public LightOnCommand(Light light) {
this.light = light;
}
public void execute() {
light.turnOn();
}
}
/**
* 调用者类 - 遥控器
*
* @author FM_南风
* @date 2024/7/5
*/
public class RemoteControl {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void pressButton() {
command.execute();
}
}
/**
* 应用
*
* @author FM_南风
* @date 2024/7/5
*/
public class CommandClient {
public static void main(String[] args) {
// 创建灯对象
Light light = new Light();
// 创建具体命令对象
Command turnOnCommand = new LightOnCommand(light);
Command turnOffCommand = new LightOffCommand(light);
// 创建遥控器对象
RemoteControl remoteControl = new RemoteControl();
// 设置命令并执行
remoteControl.setCommand(turnOnCommand);
remoteControl.pressButton(); // 打开灯
remoteControl.setCommand(turnOffCommand);
remoteControl.pressButton(); // 关闭灯
}
}
6、结果展示:
7、示例说明:
在这个示例中:Command
是命令接口,定义了执行命令的方法 execute
。LightOnCommand
和 LightOffCommand
是具体的命令类,分别用于开灯和关灯操作。Light
是接收者类,定义了实际的操作方法。RemoteControl
是调用者类,通过 setCommand
方法设置命令,通过 pressButton
方法执行命令。