当前位置: 首页 > news >正文

23种设计模式——命令模式(Command Pattern)

✅作者简介:大家好,我是 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;}@Overridepublic void execute() {receiver.startDownload(fileUrl);}@Overridepublic 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;}@Overridepublic void execute() {receiver.pauseDownload(fileUrl);}@Overridepublic 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();}}
}

五. 使用场景

命令模式用于以下场景:

  • 需要将请求调用者和请求接收者解耦
  • 需要支持撤销操作
  • 需要支持队列操作
  • 需要记录操作日志
  • 需要支持事务操作

六. 总结

命令模式的主要优点是降低了系统组件之间的耦合度,使得系统更加灵活和易于维护。但同时也要注意,过多的命令类可能会增加系统的复杂性,因此在使用时需要权衡利弊。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

http://www.dtcms.com/a/465700.html

相关文章:

  • 网站空间用万网的 域名不在万网gta5 网站正在建设中
  • 枚举单例模式:Java单例实现的终极方案解析
  • 1.单例模式有哪几种常见的实现方式?
  • 安蓉建设总公司网站服装设计官网
  • PyTorch的安装与使用
  • 解决办法:win11连接蓝牙的时候每次连接都是100%的音量
  • foundry创建项目
  • 网站整体地图怎么做招设计师在哪里找
  • C#学习小笔记(完整版)—— Patience
  • 解决MySQL8.0及其更高版本的两个安全问题——及其配置MySQL实现SSL/TLS加密通信、caching_sha2_password通信
  • Node.js性能优化:从事件循环到内存管理
  • Node.js核心模块:fs、path与http详解
  • 企业级UDP文件传输工具如何重塑数据交换格局
  • 在JavaScript / Node.js中,Web服务器参数处理与编码指南
  • 佛山新网站建设服务网站中文域名好吗
  • Python打包成exe(windows)或者app(mac)
  • 网站开发都做什么小程序电商系统开发
  • 《电子商务网站开发实训》总结抖音代运营 广州
  • 《MySQL索引优化实战从B+树原理到慢查询性能提升》
  • 深入理解MySQL索引原理B+树如何提升查询性能
  • Spring Boot 整合 Thymeleaf 生成 HTML 页面教学
  • 深入解析MySQL索引优化从B+树原理到实战性能调优
  • MySQL索引优化的艺术从B+树原理到慢查询性能提升实践
  • 解密MySQL索引优化从B+树原理到实战性能提升
  • {title:深入解析MySQL索引优化从B+树原理到实战调优策略}
  • 深入解析MySQL索引优化从B+树原理到实战避坑指南
  • 古色古香网站模板加盟网络营销推广公司
  • 北京网站建设推荐q479185700上快给手机做网站的公司
  • wordpress建站视频静态网站可以申请域名吗
  • 3. 3层神经网络的实现