✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——命令模式(Command Pattern)
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。
目录
一. 背景
说到命令模式,可能很多人会想到Windows或者Mac的命令行。其实它们的关联并不大,因为命令行界面是一个人机交互系统。的工作原理更多是基于字符串解析 + 程序调用(如 shell 脚本、可执行程序),而不是基于面向对象设计模式中的“命令对象封装”。也没有明确的 Command、Invoker、Receiver 对象模型。下面我将会像你介绍设计模式中的命令模式。
二. 介绍
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
三. 核心概念
命令模式的核心思想是将"请求"封装成对象,将发出命令的责任和执行命令的责任分割开,委派给不同的对象。这种模式通过解耦发送者和接收者来实现更灵活的设计。
在命令模式中,通常包含以下角色:
- 命令接口(Command):声明执行操作的接口
- 具体命令(ConcreteCommand):实现命令接口,持有接收者对象的引用
- 接收者(Receiver):执行具体业务逻辑的对象
- 调用者(Invoker):负责调用命令对象执行请求
- 客户端(Client):创建具体命令对象并设置其接收者
四. 代码示例
下面是一个开始和取消命令的实现。它和策略模式很像,但它最大的不同是,它将实际执行的代码都统一到了接收者 。
// 命令接口 public interface DownloadCommand { void execute(); void undo(); } // 具体命令 - 开始下载 public class StartDownloadCommand implements DownloadCommand { private DownloadReceiver receiver; private String fileUrl; public StartDownloadCommand(DownloadReceiver receiver, String fileUrl) { this.receiver = receiver; this.fileUrl = fileUrl; } @Override public void execute() { receiver.startDownload(fileUrl); } @Override public void undo() { receiver.cancelDownload(fileUrl); } } // 具体命令 - 暂停下载 public class PauseDownloadCommand implements DownloadCommand { private DownloadReceiver receiver; private String fileUrl; public PauseDownloadCommand(DownloadReceiver receiver, String fileUrl) { this.receiver = receiver; this.fileUrl = fileUrl; } @Override public void execute() { receiver.pauseDownload(fileUrl); } @Override public void undo() { receiver.resumeDownload(fileUrl); } } // 接收者 - 实际执行下载操作的对象 public class DownloadReceiver { public void startDownload(String fileUrl) { System.out.println("开始下载文件: " + fileUrl); // 实际的下载逻辑 } public void cancelDownload(String fileUrl) { System.out.println("取消下载文件: " + fileUrl); // 实际的取消下载逻辑 } public void pauseDownload(String fileUrl) { System.out.println("暂停下载文件: " + fileUrl); // 实际的暂停下载逻辑 } public void resumeDownload(String fileUrl) { System.out.println("恢复下载文件: " + fileUrl); // 实际的恢复下载逻辑 } } // 调用者 - 管理命令的执行 public class DownloadInvoker { private DownloadCommand command; private Stack<DownloadCommand> commandHistory = new Stack<>(); public void setCommand(DownloadCommand command) { this.command = command; } public void executeCommand() { command.execute(); commandHistory.push(command); } public void undoLastCommand() { if (!commandHistory.isEmpty()) { DownloadCommand lastCommand = commandHistory.pop(); lastCommand.undo(); } } }
五. 使用场景
命令模式用于以下场景:
- 需要将请求调用者和请求接收者解耦
- 需要支持撤销操作
- 需要支持队列操作
- 需要记录操作日志
- 需要支持事务操作
六. 总结
命令模式的主要优点是降低了系统组件之间的耦合度,使得系统更加灵活和易于维护。但同时也要注意,过多的命令类可能会增加系统的复杂性,因此在使用时需要权衡利弊。
最后,
其它设计模式会陆续更新,希望文章对你有所帮助!