下面是一篇关于设计模式之命令模式(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;
}
@Override
public void execute() {
light.turnOn();
}
}
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public 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、事务、任务队列等场景。掌握命令模式有助于编写灵活、可扩展的代码结构。
建议:
- 当你需要对操作进行记录、撤销、排队等管理时,优先考虑命令模式
- 命令模式与责任链、观察者等模式常结合使用
如需更多设计模式讲解或源码分析,欢迎留言交流!