探索设计模式:命令模式
- 🧐1. 概念
- 🎯2. 作用
- 📦3. 实现
- 3.1 定义命令接口
- 3.2 实现具体命令
- 3.3 实现接收者
- 3.4 实现调用者
- 3.5 使用
- 💻4. 应用场景
命令模式(Command Pattern
)就是一种行为型设计模式。其核心思想是将请求封装成一个对象,从而使你可以使用不同的请求、队列或者请求日志参数化其他对象,同时支持可撤销的操作。通过命令模式,可以将请求的发起者和接收者完全解耦,提高系统的灵活性和可扩展性。
🧐1. 概念
想象一下,当你在家里使用遥控器控制电视时,你按下遥控器上的“电源”按钮,电视就会开启或关闭。在这个过程中,遥控器(调用者)并不知道电视(接收者)是如何工作的,它只是发送了一个“打开”或“关闭”的请求。命令模式正是基于这样的思路,将请求本身封装成一个对象,这样可以更容易地管理和执行请求。
命令模式通常包含四个关键角色:
- 命令(
Command
):这是一个抽象类或接口,定义了执行操作的标准方法。所有的具体命令类都实现了这个接口,确保它们可以以统一的方式被调用。 - 具体命令(
Concrete Command
):这是命令接口的具体实现,包含了执行操作的具体逻辑。每个具体命令类都关联了一个接收者对象,并且知道如何调用接收者的某个方法来完成任务。 - 接收者(
Receiver
):接收者是真正执行命令的对象。它包含了具体的业务逻辑,当一个命令被执行时,实际上是调用了接收者的一个或多个方法。 - 调用者(
Invoker
):调用者负责触发命令的执行。它可以持有一个或多个命令对象,并在适当的时候调用命令的执行方法。调用者不需要知道命令的具体实现细节,只需要知道如何调用即可。
🎯2. 作用
- 解耦:命令模式最大的优势在于它能够彻底解耦命令的发起者和接收者,使两者之间的依赖关系降到最低。这意味着可以在不改变原有代码的情况下,轻松地引入新的命令类型或修改现有命令的行为。
- 扩展性:由于命令对象实现了统一的接口,因此可以很容易地添加新的命令类,而不会影响到现有的系统接口。此外,命令模式还支持组合命令,即一个命令可以包含多个子命令,形成更复杂的操作序列。
📦3. 实现
假设我们要开方法一个简单的智能家居控制系统,用户可以通过遥控器(调用者)控制家中的各种电器设备(接收者),如灯光、电视等。
我们可以通过命令模式来实现这一功能。
3.1 定义命令接口
public interface Command {void execute();
}
3.2 实现具体命令
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}}
3.3 实现接收者
public class Light {public void turnOn(){System.out.println("Light is on");}public void turnOff(){System.out.println("Light is off");}}
3.4 实现调用者
public class RemoteControl {private Command command;public void setCommand(Command command){this.command = command;}public void pressButton(){command.execute();}}
3.5 使用
public class CommandClient {public static void main(String[] args) {Light light = new Light();// 遥控器对象RemoteControl remoteControl = new RemoteControl();// 具体命令对象LightOnCommand lightOnCommand = new LightOnCommand(light);LightOffCommand lightOffCommand = new LightOffCommand(light);// 为遥控器设置命令remoteControl.setCommand(lightOnCommand);// remoteControl.setCommand(lightOffCommand);// 按下遥控器按钮remoteControl.pressButton();}}
💻4. 应用场景
- 用户界面操作:在图形用户界面中,命令模式常用于处理各种用户输入事件,如按钮点击、菜单选择等。通过将这些操作封装成命令对象,界面组件可以独立于具体的业务逻辑,提高了代码的可复用性和可测试性。
- 事务管理:在需要支持事务回滚的系统中,命令模式可以帮助实现复杂的撤销/重做功能。每个命令不仅包含执行操作的方法,还可以包含撤销操作的方法,从而在必要时恢复到之前的状态。
- 队列处理:当系统需要处理大量异步请求时,可以使用命令模式将请求封装成命令对象并放入队列中等待处理。这中做法有助于平滑负载,避免资源争用。
- 日志记录:对于需要记录操作历史以便后续审计或分析的系统,命令模式提供了一种自然的方式来保存命令对象,方便日后查询和恢复。