【设计模式】Java 设计模式之模板命令模式(Command)
命令模式(Command)的深入分析与实战解读
一、概述
命令模式是一种将请求封装为对象从而使你可用不同的请求把客户端与接受请求的对象解耦的模式。在命令模式中,命令对象使得发送者与接收者之间解耦,发送者通过命令对象来执行请求,而接收者则执行命令对象的操作。
二、模式结构
命令模式主要包含四个角色:
- 抽象命令类(Command):声明执行操作的接口。
- 具体命令类(ConcreteCommand):实现抽象命令接口的具体命令类,它持有接收者对象,并调用接收者的相应操作以执行请求。
- 接收者类(Receiver):执行具体操作的类。
- 调用者类(Invoker):要求命令对象执行请求。
三、实现方式
命令模式的实现可以通过接口或抽象类来定义命令的行为,具体命令类实现这些行为,并持有对接收者的引用。调用者通过命令对象来调用接收者的方法,而无需直接知道接收者的具体类型。

直接请求,依赖关系太强。Handler类的改变,需要修改ListView。
通过增加Command抽象命令类,将不符合抽象编程的handler 调用,转为抽象编程。
四、代码示例
// 抽象命令类
public interface Command {void execute();
}// 具体命令类
public class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();}
}// 接收者类
public class Receiver {public void action() {System.out.println("Receiver action performed.");}
}// 调用者类
public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}
五、优点
- 解耦:命令模式将请求与具体实现解耦,使得调用者与接收者之间不再直接依赖。
- 灵活性和扩展性:可以很容易地添加新的命令类型,无需修改现有代码。
- 可撤销和恢复:可以在命令对象中实现撤销和恢复操作。
六、缺点
- 可能产生过多具体命令类:对于每一个请求都可能需要一个具体命令类,导致系统复杂性增加。
- 可能不适合所有情况:在一些简单场景下,引入命令模式可能增加不必要的复杂性。
七、应用场景
- GUI应用:如按钮点击事件处理,每个按钮对应一个命令对象。
- 事务处理:将事务封装为命令对象,便于管理事务的执行和撤销。
- 日志记录:将日志记录操作封装为命令对象,便于灵活配置日志记录行为。
八、实战解读
以GUI应用为例,假设有一个“撤销”按钮,用户点击该按钮时希望撤销上一步的操作。通过命令模式,可以将每个操作封装为一个命令对象,并维护一个命令历史栈。当用户点击“撤销”按钮时,从栈中弹出最后一个命令并执行其撤销操作。
九、注意事项
在使用命令模式时,需要注意避免过度使用,以免增加不必要的复杂性。同时,要确保命令对象的执行和撤销操作是安全的,不会导致系统状态不一致或数据损坏。
十、命令模式的可维护性
命令模式使得请求的处理逻辑可以被封装和复用,这大大提高了系统的可维护性。当需要修改某个操作的行为时,只需修改相应的命令类,而无需影响其他部分的代码。
十一、命令队列和宏命令
命令模式支持将多个命令组合成一个命令队列或宏命令,从而一次性执行多个操作。这为用户提供了更高级别的操作灵活性,并简化了复杂操作的执行过程。
十二、命令模式与策略模式的关系
命令模式与策略模式在某种程度上具有相似性,都涉及到行为的封装和替换。然而,命令模式更侧重于请求的处理和封装,而策略模式则更侧重于算法的封装和替换。在实际应用中,可以根据具体需求选择使用哪种模式。
十三、命令模式的线程安全性
在多线程环境中,命令模式可以确保每个命令对象的执行是线程安全的。通过将命令对象设计为无状态的,可以避免多线程间的数据竞争和状态不一致问题。
十四、命令模式的扩展性
命令模式具有良好的扩展性,可以通过添加新的命令类来扩展系统的功能。这使得系统在面对新的需求或变更时能够更加灵活地应对,降低了系统的维护成本。
综上所述,命令模式不仅提高了系统的可维护性和可扩展性,还为多线程环境下的请求处理提供了线程安全的保障。同时,它与策略模式等其他设计模式相互配合,可以构建出更加灵活和健壮的系统架构。
相关文章:
【设计模式】Java 设计模式之模板命令模式(Command)
命令模式(Command)的深入分析与实战解读 一、概述 命令模式是一种将请求封装为对象从而使你可用不同的请求把客户端与接受请求的对象解耦的模式。在命令模式中,命令对象使得发送者与接收者之间解耦,发送者通过命令对象来执行请求…...
如何在Flutter中实现一键登录
获取到当前手机使用的手机卡号,直接使用这个号码进行注册、登录,这就是一键登录。 可以借助极光官方的极光认证实现 1、注册账户成为开发者 2、创建应用开通极光认证 (注意开通极光认证要通过实名审核) 3、创建应用获取appkey、 …...
Amazon SageMaker + Stable Diffusion 搭建文本生成图像模型
如果我们的计算机视觉系统要真正理解视觉世界,它们不仅必须能够识别图像,而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 近两年,以ChatGPT为代表的AIGC技术崭露头角,逐渐从学术研究的象牙塔迈…...
FPGA数字信号处理前沿
生活在这个色彩斑斓的世界里,大家的身边存在太多模拟信号比如光能、电压、电流、压力、声音、流速等。数字信号处理作为嵌入式研发的一个经久不衰热门话题,可以说大到军工武器、航空航天,小到日常仪器、工业控制,嵌入式SOC芯片数字…...
【Android】系统启动流程分析 —— init 进程启动过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程,准确的说,它是 Linux 系统中用户控制的第一个进程,它的进程号为 1,它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…...
抖音视频批量下载软件可导出视频分享链接|手机网页视频提取|视频爬虫采集工具
解锁抖音视频无水印批量下载新姿势! 在快节奏的生活中,抖音作为时下最热门的短视频平台之一,吸引着广大用户的目光。而如何高效地获取喜欢的视频内容成为了许多人关注的焦点。Q:290615413现在,我们推出的抖音视频批量下载软件&…...
鸿蒙Harmony应用开发—ArkTS-@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二…...
深度解析:Elasticsearch写入请求处理流程
版本 Elasticsearch 8.x 原文链接:https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求,到 Elasticsearch 接收请…...
数据结构:堆和二叉树遍历
堆的特征 1.堆是一个完全二叉树 2.堆分为大堆和小堆。大堆:左右节点都小于根节点 小堆:左右节点都大于根节点 堆的应用:堆排序,topk问题 堆排序 堆排序的思路: 1.升序排序,建小堆。堆顶就是这个堆最小…...
[Halcon学习笔记]在Qt上实现Halcon窗口的字体设置颜色设置等功能
1、 Halcon字体大小设置在Qt上的实现 在之前介绍过Halcon窗口显示文字字体的尺寸和样式,具体详细介绍可回看 (一)Halcon窗口界面上显示文字的字体尺寸、样式修改 当时介绍的设定方法 //Win下QString Font_win "-Arial-10-*-1-*-*-1-&q…...
ArcGis 地图文档
ArcGis官网 https://developers.arcgis.com/labs/android/create-a-starter-app/ Arcgis for android 加载谷歌、高德和天地图 https://blog.csdn.net/qq_19688207/article/details/108125778 AeroMap图层地址: API_KEY: 7e95eae2-a18d-34ce-beaa-894d6a08c5a5 街道图…...
【C语言】动态内存分配
1、为什么要有动态内存分配 不管是C还是C中都会大量的使用,使用C/C实现数据结构的时候,也会使用动态内存管理。 我们已经掌握的内存开辟方式有: int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间…...
算法思想总结:位运算
创作不易,感谢三连支持!! 一、常见的位运算总结 标题 二、位1的个数 . - 力扣(LeetCode) 利用第七条特性:n&(n-1)干掉最后一个1,然后每次都用count去统计ÿ…...
四、HarmonyOS应用开发-ArkTS开发语言介绍
目录 1、TypeScript快速入门 1.1、编程语言介绍 1.2、基础类型 1.3、条件语句 1.4、函数 1.5、类 1.6、模块 1.7、迭代器 2、ArkTs 基础(浅析ArkTS的起源和演进) 2.1、引言 2.2、JS 2.3、TS 2.4、ArkTS 2.5、下一步演进 3、ArkTs 开发实践…...
3 Spring之DI详解
5,DI相关内容 前面我们已经完成了bean相关操作的讲解,接下来就进入第二个大的模块DI依赖注入,首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注入描述了在容器中建…...
Web框架开发-Ajax
一、 Ajax准备知识:json 1、json(Javascript Obiect Notation,JS对象标记)是一种轻量级的数据交换格式 1 2 它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。…...
Python爬虫之urllib库
1、urllib库的介绍 可以实现HTTP请求,我们要做的就是指定请求的URL、请求头、请求体等信息 urllib库包含如下四个模块 request:基本的HTTP请求模块,可以模拟请求的发送。error:异常处理模块。parse:工具模块&#x…...
Docker学习笔记 - 常用命令
目录 基本概念常用命令使用docker compose启动脚本创建自己的image Docker命令文档 1. 下载一个image 从hub.docker.com下载一个image。 docker pull [image name]下载时指定image的tag。 docker pull [image name]:<tag>举例,下载postgre的tag为alpine…...
数学建模(Topsis python代码 案例)
目录 介绍: 模板: 案例: 极小型指标转化为极大型(正向化): 中间型指标转为极大型(正向化): 区间型指标转为极大型(正向化): 标准化处理: 公式: Topsis(优劣解距离法): 公式: 完整代码: 结果: 介绍: 在数学建模中,Topsis方法是一种多准则决策分…...
gateway网关指定路由响应超时时间
gateway网关指定路由响应超时时间 spring:cloud:gateway:httpclient:responseTimeout: 10000这个配置用于设置HttpClient的响应超时时间,单位是毫秒。具体来说,这个配置表示当Gateway向后端服务发出请求后,如果在10秒内没有收到后端服务的响…...
蓝牙抓包不求人:从HCI日志里‘挖’出Link Key的两种实用方法(附安卓路径)
蓝牙安全逆向实战:从HCI日志中提取Link Key的深度解析在蓝牙协议安全研究领域,Link Key作为设备配对认证的核心凭证,其获取方式一直是逆向工程师关注的焦点。许多安全审计场景下,我们往往只能获得加密后的HCI通信日志,…...
新手也能懂的SSRF漏洞实战:用iwebsec靶场复现文件读取与内网探测
从零开始掌握SSRF漏洞:iwebsec靶场实战指南1. 认识SSRF漏洞的本质想象一下,你正在一家高档餐厅点餐,服务员承诺可以帮你从任何地方获取食材——包括隔壁竞争对手的厨房。SSRF(Server-Side Request Forgery)漏洞就像这个…...
HFSS仿真结果怎么看?以T型波导为例,读懂S参数与电场动态图
HFSS仿真结果深度解析:从S参数到电场动态图的实战指南当你第一次在HFSS中完成T型波导仿真后,面对满屏的曲线和彩色云图,是否感到既兴奋又困惑?那些起伏的S参数曲线究竟告诉你什么信息?电场图中跳跃的颜色又代表怎样的物…...
DIY复刻经典:Texar Audio Prism动态处理器克隆套件全攻略
1. 项目概述:Texar Audio Prism 克隆套件如果你在专业音频圈子里混过一段时间,尤其是对上世纪八九十年代那些经典的、带点“魔法”色彩的外置动态处理器感兴趣,那么“Texar Audio Prism”这个名字你大概率不会陌生。它不是最常见的1176或者LA…...
D3KeyHelper:暗黑3玩家的智能按键助手,告别重复操作疲劳
D3KeyHelper:暗黑3玩家的智能按键助手,告别重复操作疲劳 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是否曾在《暗黑破坏…...
森优时铁锌维发根养黑用三个月真实效果实测:内服营养养黑的客观测评
"森优时铁锌维发根养黑用三个月真实效果实测显示,针对压力、熬夜引发的早白问题,通过内服补充毛囊所需营养的方式,多数使用者能感受到发根韧性提升、新生发色素沉淀改善,整体改善效果因人而异,合规的营养补充是目…...
航空航天为什么离不开高强镁合金?国产替代到哪一步了
飞机每减重一千克,全年大约节省四千两百美元的燃油费用——这是航空工程师熟悉的经验值。在商业航空领域,这个数字还只是财务账;在战斗机、导弹和卫星的世界里,减重的收益被换算成更远的航程、更大的载荷、更高的机动性࿰…...
光轮智能 谢晨 访谈总结机器人仿真数据产业
光轮智能 谢晨 访谈总结机器人仿真关于创始人关于数据数据金字塔数据痛点仿真数据的重要性仿真数据的质量b站链接地址公司官网关于创始人 清华物理;哥伦比亚金融;英伟达智驾仿真;小鹏智驾仿真;现为光轮智能CEO 关于数据 数据的…...
179个核心职位,50个公司分类,中国大模型产业全栈
最后 对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大? 答案只有一个:人工智能(尤其是大模型方向)…...
在线文档协作工具选型必看:14款产品对比(2026版)
一、在线文档协作工具的概念解析及其核心功能 在线文档协作工具是基于云端的文档创建、编辑、共享与协同沟通平台,核心目标是让团队在同一份资料上“实时共同工作”,减少反复传文件、版本混乱与沟通成本。 企业常见的核心能力包括: 多人实…...
