23种设计模式之命令模式
一、什么是命令模式?
命令模式是一种行为型设计模式,它将请求封装成对象,从而允许你参数化不同请求、排队或记录请求日志,以及支持可撤销的操作。
通俗理解:想象你在餐厅点餐:服务员(调用者)把你的点单(命令)交给厨师(接收者),厨师根据点单做饭。服务员不需要知道怎么做饭,只需要传递命令。这就是命令模式的核心思想——把"操作"封装成"命令"对象。
二、生活中的例子
- 餐厅点餐:服务员把点单传递给厨师
- 电视遥控:遥控器发出命令,电视执行
- 撤销功能:编辑器中的Ctrl+Z撤销操作
三、代码示例
1. 命令接口和接收者
// 命令接口public interface Command { void execute(); void undo(); // 撤销}// 接收者:灯public class Light { public void on() { System.out.println("灯亮了"); } public void off() { System.out.println("灯关了"); }}2. 具体命令
// 开灯命令public class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } @Override public void undo() { light.off(); }}// 关灯命令public class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); } @Override public void undo() { light.on(); }}3. 调用者(遥控器)
// 遥控器(调用者)public class RemoteControl { private Command command; private Command undoCommand; // 上一次执行的命令 public void setCommand(Command command) { this.command = command; } public void pressButton() { command.execute(); undoCommand = command; // 保存以便撤销 } public void pressUndo() { if (undoCommand != null) { undoCommand.undo(); } }}4. 客户端使用
public class Client { 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.pressUndo(); // 输出:灯关了 }}四、优缺点分析
优点 | 缺点 |
解耦调用者和接收者 | 类数量增加 |
支持撤销和重做 | 撤销逻辑复杂 |
可以组合命令(宏命令) | |
符合开闭原则 |
|
五、使用场景
- 当需要撤销操作时(如编辑器)
- 当需要记录操作日志时
- 当需要参数化操作时
六、总结
命令模式把请求封装成对象,从而实现了请求的排队、记录日志、撤销等功能。在实际开发中,事务管理、宏命令、任务队列等都用到命令模式。掌握这个模式,可以让操作更加灵活和可控。
文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有
