设计模式笔记_行为型_命令模式
1.命令模式介绍
命令模式(Command Pattern)是一种行为设计模式,它将请求或操作封装为对象,使得可以用不同的请求对客户端进行参数化。命令模式的核心思想是将方法调用、请求或操作封装到一个独立的命令对象中,从而使得客户端与请求的接收者分离。
结构组成:命令模式通常包含以下几个组件:
- Command(命令)接口:定义执行操作的接口。
- ConcreteCommand(具体命令)类:实现命令接口并定义具体的操作。
- Receiver(接收者):实际执行命令的对象,具体实现操作。
- Invoker(调用者):持有一个命令对象,调用命令对象执行请求。
类比场景:想象一下,你家里有一个智能灯,你可以按下遥控器上的按钮来打开或关闭灯。
- 这里遥控器就是Invoker,调用开关灯命令对象执行开关灯请求;
- 遥控器的每个按钮相当于一个命令对象command,它负责执行具体的开关灯操作;
- 智能灯就是Receiver,是实际执行开关命令的对象
优缺点分析
- 优点:
- 解耦:将请求的发送者和接收者解耦,使得命令对象可以灵活地扩展和组合。
- 可扩展性:可以很容易地添加新的命令,符合开放-关闭原则。
- 支持撤销操作:可以通过在命令对象中实现撤销功能来支持操作的撤销和重做。
- 缺点:
- 可能导致类膨胀:对于每个命令都需要定义一个具体命令类,可能会导致类数量增加。
- 复杂性增加:引入了额外的抽象层,可能导致系统复杂性增加
2. 代码演示
演示场景:使用遥控器控制智能灯的开关。
Command(命令)接口: 定义执行操作的接口。
// Command接口
public interface Command {void execute();
}
ConcreteCommand(具体命令)类:实现命令接口并定义具体的操作。
// ConcreteCommand类:持有接收者对象Light,调用接收者来执行命令
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
Receiver(接收者):实际执行命令的对象,具体实现操作。
// Receiver类
public class Light {public void turnOn() {System.out.println("The light is on");}public void turnOff() {System.out.println("The light is off");}
}
Invoker(调用者):持有命令对象,负责调用命令对象执行请求。
// Invoker类
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
客户端代码:
public class CommandClientDemo {public static void main(String[] args) {Light livingRoomLight = new Light();Command lightOn = new LightOnCommand(livingRoomLight);Command lightOff = new LightOffCommand(livingRoomLight);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton(); // 输出: The light is onremote.setCommand(lightOff);remote.pressButton(); // 输出: The light is off}
}
对应的类图: