深入理解设计模式之命令模式
下面是一篇关于设计模式之命令模式(Command Pattern)的详细博客,并附有 Java 实现代码示例。
深入理解设计模式之:命令模式(Command Pattern)
一、什么是命令模式?
命令模式(Command Pattern)是一种行为型设计模式。它将“请求”封装成对象,从而使你可以用不同的请求对客户进行参数化,对请求排队、记录请求日志,以及支持可撤销的操作。
命令模式的核心思想是将请求的发起者和执行者解耦,让两者不直接交互,而是通过命令对象进行沟通。
二、命令模式的应用场景
- 需要将操作请求、操作日志、撤销操作等功能解耦时
- 需要支持命令的排队、记录、撤销、重做等功能
- GUI 按钮、菜单的事件处理
- 事务型操作(如数据库事务、宏命令)
三、命令模式的结构
- Command(抽象命令):声明执行操作的接口
- ConcreteCommand(具体命令):实现 Command 接口,绑定接收者对象,调用接收者相应操作
- Receiver(接收者):知道如何实施与执行一个请求相关的操作
- Invoker(调用者):要求命令对象执行请求
- Client(客户端):创建具体命令对象并设置其接收者
四、命令模式的 UML 类图
+---------+ +----------------+ +-------------+
| Invoker |------->| Command |<-------| Client |
+---------+ +----------------+ +-------------+/_\|+-----------------------------+| |
+-------------------+ +-------------------+
| ConcreteCommandA | | ConcreteCommandB |
+-------------------+ +-------------------+| |+-----------------------------+|+-------------+| Receiver |+-------------+
五、Java 实现代码示例
1. 抽象命令接口
public interface Command {void execute();
}
2. 接收者(Receiver)
public class Light {public void turnOn() {System.out.println("灯打开了");}public void turnOff() {System.out.println("灯关闭了");}
}
3. 具体命令(ConcreteCommand)
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();}
}
4. 调用者(Invoker)
public class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}
5. 客户端(Client)
public class Main {public static void main(String[] args) {Light light = new Light();Command lightOn = new LightOnCommand(light);Command lightOff = new LightOffCommand(light);RemoteControl remote = new RemoteControl();remote.setCommand(lightOn);remote.pressButton(); // 输出:灯打开了remote.setCommand(lightOff);remote.pressButton(); // 输出:灯关闭了}
}
六、命令模式的优缺点
优点:
- 解耦请求发送者和接收者
- 易于扩展新命令
- 支持撤销、重做、记录日志等功能
- 可以将一组命令组合成宏命令
缺点:
- 可能导致系统中类的数量增加
- 结构相对复杂
七、实际应用举例
- GUI 按钮事件处理:每个按钮绑定一个命令对象,点击时执行命令
- 事务操作:数据库操作的撤销与重做
- 任务队列:将命令对象放入队列,异步执行
八、总结
命令模式是实现“请求-执行”解耦的经典方案,广泛应用于 GUI、事务、任务队列等场景。掌握命令模式有助于编写灵活、可扩展的代码结构。
建议:
- 当你需要对操作进行记录、撤销、排队等管理时,优先考虑命令模式
- 命令模式与责任链、观察者等模式常结合使用
如需更多设计模式讲解或源码分析,欢迎留言交流!