Java设计模式【命令模式】-行为型
1. 介绍
命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与执行者分离,使两者独立变化。
命令模式包含以下几个关键角色:
- 命令(Command):定义执行命令的接口,通常包含一个
execute()方法。 - 具体命令(Concrete Command):实现命令接口,负责调用接收者的相关操作。
- 接收者(Receiver):执行具体操作的逻辑。
- 调用者(Invoker):持有命令对象,并通过调用命令对象的
execute()方法,来触发命令的执行。 - 客户端(Client):负责创建具体的命令对象,并将其传递给调用者。
1.1 优缺点
优点:
- 解耦请求的发送者和执行者:命令模式将请求的发送者和执行者解耦,发送者不需要知道执行者的存在及其实现细节。
- 可扩展性强:通过引入新的命令类,可以轻松扩展系统功能而不影响其他部分。
- 支持撤销和重做操作:命令模式支持记录命令,从而可以实现撤销、重做等操作。
- 支持组合命令:可以将多个命令组合在一起,构成一个复合命令,以便一次执行多个操作。
缺点:
- 增加系统复杂性:每个操作都需要设计一个命令类,可能导致系统中的类数量大幅增加。
- 命令链的维护:如果存在复杂的命令链,可能需要额外的管理工作。
2. 应用场景
命令模式适用于以下场景:
- 需要解耦请求的发送者和执行者:发送请求的对象不应直接依赖执行请求的对象。
- 支持撤销和重做功能:需要保存执行记录,并支持回滚操作。
- 需要日志记录或事务管理:命令模式可以记录每一个请求及其执行状态,便于后续处理。
- 宏命令(组合命令):需要一次执行一组命令时,使用命令模式可以方便地管理和执行多个命令。
3. Java实现示例
以下是一个简单的命令模式的Java实现,模拟一个遥控器控制设备的场景。
// 命令接口
interface Command {void execute();
}// 接收者:电灯
class Light {public void turnOn() {System.out.println("Light is ON");}public void turnOff() {System.out.println("Light is OFF");}
}// 具体命令:打开灯的命令
class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOn();}
}// 具体命令:关闭灯的命令
class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.turnOff();}
}// 调用者:遥控器
class RemoteControl {private Command command;public void setCommand(Command command) {this.command = command;}public void pressButton() {command.execute();}
}// 客户端
public class CommandPatternDemo {public static void main(String[] args) {// 创建接收者对象Light livingRoomLight = new Light();// 创建命令对象Command lightOn = new LightOnCommand(livingRoomLight);Command lightOff = new LightOffCommand(livingRoomLight);// 创建调用者RemoteControl remote = new RemoteControl();// 打开灯remote.setCommand(lightOn);remote.pressButton();// 关闭灯remote.setCommand(lightOff);remote.pressButton();}
}
在这个例子中,Light是接收者,LightOnCommand和LightOffCommand是具体命令,而RemoteControl是调用者。客户端通过设置命令来控制灯的状态。
4. Spring中使用场景
在Spring框架中,命令模式应用在以下几个地方:
- Spring的事务管理(Transaction Management):Spring的事务管理中,命令模式用于封装事务执行逻辑。例如,在执行数据库操作时,
PlatformTransactionManager可以看作是一个命令接口,事务操作是具体的命令实现。 - Spring Batch:Spring Batch框架使用了命令模式来处理批量任务中的执行步骤。每个任务步骤可以看作是一个命令,执行时调用相应的命令来完成具体操作。
- Spring的事件处理机制:Spring的事件驱动模型中,事件的发布和处理类似于命令模式。发布者(调用者)触发事件,而事件监听器(接收者)执行相应的处理逻辑。
5. 总结
命令模式通过将请求封装为对象,使得请求的发送者与执行者解耦,提供了一个灵活、可扩展的设计模式。它不仅支持撤销和重做,还能将多个命令组合起来进行批量处理,适用于需要复杂操作管理和扩展性的场景。
虽然命令模式可能会增加系统的复杂性,但它在解耦、扩展、撤销、重做等方面的优势,使得它成为软件设计中的常用模式。在Spring中,命令模式被应用于事务管理、批处理任务和事件驱动机制等多个场景,帮助开发者简化请求的处理流程并提高代码的复用性。
4o
相关文章:
Java设计模式【命令模式】-行为型
1. 介绍 命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…...
【HarmonyOS】一键扫码功能
【HarmonyOS】一键扫码功能 前言 鸿蒙在api10之后,对系统api的基础上,封装了较为复杂功能的开发工具包,统一称之为Kit。这些Kit根据功能定义的不同,划分为不同的种类Kit。如下图所示: 其实可以理解为集成在系统中的…...
Spring Boot应用中集成与使用多数据源
Spring Boot应用中集成与使用多数据源 1. 前言 通过定义和使用多个数据源,能在Spring Boot应用中实现更复杂的数据管理场景,比如读写分离、数据冗余等。 2. 准备工作 环境准备:确保已经准备好Spring Boot的开发环境。数据库准备ÿ…...
探索 JavaScript 中的 instanceof 关键字
在 JavaScript 这门灵活而强大的编程语言中,instanceof 是一个非常重要的操作符,它用于检测一个对象是否在其原型链的原型构造函数的 prototype 属性中出现。简而言之,instanceof 用于测试一个对象是否是其父类或者其原型链上某个构造函数的实…...
Python爬虫02
xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg: lxml模块&xpath语法 谷歌浏览器 xpath helper 插件 作用对当前页面…...
HTTP/3
http相关知识点 HTTP/3是超文本传输协议(HTTP)的最新版本,旨在进一步提高Web性能和安全性。HTTP/3的显著变化是它基于QUIC(Quick UDP Internet Connections)协议,而不是之前版本中使用的TCP协议。QUIC是由…...
MySQL 字符串操作详解和案例示范
MySQL 字符串操作详解 MySQL 提供了丰富的字符串操作函数,能够对这些字符串进行截取、定位、替换等操作。本文将详细讲解 MySQL 中的字符串操作函数,包括 SUBSTRING()、SUBSTR()、LEFT()、RIGHT()、LOCATE()、POSITION()、FIND_IN_SET()、ELT()、INSERT…...
全双工语音交互
文章目录 微软小冰全双工字节大模型语音交互[Language Model Can Listen While Speaking](https://arxiv.org/html/2408.02622v1) 微软小冰全双工 全双工的定义:一路持续的听,upload audio;一路持续的输出,download audio…...
nginx中如何设置gzip
前言 Nginx通过配置gzip压缩可以提升网站整体速度 Nginx的gzip功能是用于压缩HTTP响应内容的功能。当启用gzip时,在发送给客户端之前,Nginx会将响应内容压缩以减小其大小。这样可以减少数据传输的带宽消耗和响应时间,提高网站的性能和速度。…...
借老系统重构机会我写了个groovy规则引擎
公司老系统的重构计划早就有了,为了对Java硬编码的各种校验规则进行重构,特地参考了相关技术,最终选择了groovy进行了系统的学习,并编写了一个即插即用的轻量级规则引擎。 文章目录 项目背景技术选型groovy的性能groovy脚本执行线…...
C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码+硬编码录制MP4
目录 说明 效果 项目 代码 下载 说明 利用周杰的开源项目 Sdcb.FFmpeg 项目地址:https://github.com/sdcb/Sdcb.FFmpeg/ 代码实现参考:https://github.com/sdcb/ffmpeg-muxing-video-demo 效果 C#利用ffmpeg借助NVIDIA GPU实现实时RTSP硬解码硬…...
第4章 汇编语言和汇编软件
第4章 汇编语言和汇编软件 该章主要介绍了汇编语言和汇编语言编译器的安装和使用。 汇编语言程序 该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。 书中有提到CPU有不同的架构,汇编语言有不同的风格,那么不同的CPU架构和不同的汇…...
网络安全在2024好入行吗?
前言 024年的今天,慎重进入网安行业吧,目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多,还有很多高中被挖过来的大佬。 理由很简单,目前来说,信息安全的圈子人少,985、211院校很多都才建立…...
C++练习
要求 1. 函数命名清晰 使用描述性的命名,准确反映函数的功能。例如,使用 CalculateSum() 而不是 sum()。避免使用缩写或模糊不清的名字,确保变量和函数名有明确的含义。 2. 参数传递 根据需要选择按值传递、按引用传递或按指针传递。如果…...
3. GIS后端工程师岗位职责、技术要求和常见面试题
本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...
Linux学习笔记(4)----Debian压力测试方法
使用命令行终端压力测试需要两个实用工具:s-tui和stress sudo apt install s-tui stress 安装完成后,在终端中启动 s-tui实用工具: s-tui 执行后如下图: 你可以使用鼠标或键盘箭头键浏览菜单,然后点击“压力选项(Str…...
xml详解
一、XML是什么 XML(可扩展标记语言)是一种非常常用的数据存储和交换格式。 二、XML 的基本结构 声明 XML 文件通常以 XML 声明开始,例如:<?xml version"1.0" encoding"UTF-8"?>。它指定了 XML 的版…...
C140 杨辉三角
C140 杨辉三角 题目题解(94)讨论(102)排行面经 new 简单 通过率:29.57% 时间限制:1秒 空间限制:256M 知识点C工程师牛客 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,…...
C++字符串操作中的陷阱
休对故人思故国,且将新火试新茶。诗酒趁年华。 ——《望江南超然台作》【宋】苏轼 目录 正文: 首先我们要明白出现问题的原因: 1. 缓冲区溢出 2. 错误的字符串声明方式 3. 缺乏对NULL指针的检查 解决方案: 下期预告:C字符串…...
最值求解 | 管理类联考数学专项
日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】...
红队评估红日靶场7
声明 本文所涉及的技术、代码、工具及方法仅供网络安全研究与授权测试使用。 未经目标系统所有者书面授权,严禁对任何系统进行渗透测试、漏洞探测或攻击行为。 作者(本人)对因滥用本文内容而导致的任何直接或间接后果不承担法律责任。 请遵守…...
AI读脸术与PyTorch方案对比:CPU推理速度谁更强?实战评测
AI读脸术与PyTorch方案对比:CPU推理速度谁更强?实战评测 1. 引言 你有没有想过,给一张照片,AI就能告诉你里面的人是男是女、大概多大年纪?听起来像是科幻电影里的场景,但现在,这已经是触手可及…...
Applicative Functor应用指南:mostly-adequate-guide-chinese中的瓶中之船与协调激励
Applicative Functor应用指南:mostly-adequate-guide-chinese中的瓶中之船与协调激励 【免费下载链接】mostly-adequate-guide-chinese 函数式编程指南中文版 项目地址: https://gitcode.com/gh_mirrors/mo/mostly-adequate-guide-chinese 在函数式编程的世界…...
AI绘画工作流:OpenClaw+Phi-3-vision-128k-instruct实现提示词自动优化
AI绘画工作流:OpenClawPhi-3-vision-128k-instruct实现提示词自动优化 1. 为什么需要自动化提示词优化 作为一名长期使用Stable Diffusion进行创作的数字艺术家,我发现自己每天要花费大量时间在提示词(prompt)的调试上。有时候为…...
Android NFC开发实战:从基础到应用场景解析
1. Android NFC技术入门指南 第一次接触NFC开发时,我被这个看似简单却功能强大的技术深深吸引。NFC(近场通信)就像给你的手机装上了"电子触角",只需要轻轻一碰就能完成数据传输。与蓝牙、WiFi相比,NFC的最大…...
AI Coding越来越强,我们还有必要学Processing吗? · 创意编程嚼
故障表现 发现请求集群 demo 入口时卡住,并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...
如何高效查询数据库中一对多关联的多项选择字段
本文讲解如何通过规范化数据库设计与标准 sql 关联查询,准确获取农民注册信息及其多个专业领域(多对一/一对多关系),解决因表结构不合理导致的查询失败问题。 本文讲解如何通过规范化数据库设计与标准 sql 关联查询,准…...
Blazor WebAssembly AOT编译踩坑实录(含.NET 9 RTM正式版12类崩溃场景+符号映射调试秘钥)
第一章:Blazor WebAssembly AOT编译的核心价值与2026演进定位Blazor WebAssembly 的 AOT(Ahead-of-Time)编译自 .NET 6 起引入,并在 .NET 7/8 中持续优化,其核心价值在于将 C# 代码直接编译为高度优化的 WebAssembly 二…...
如何处理死锁异常_ORA-00060捕获与重试机制设计
ORA-00060是死锁,非单纯竞争;Oracle检测到多个会话互持对方所需锁并主动回滚其中一个事务,需通过trace文件分析Deadlock graph定位具体行锁冲突及session,不可盲目重试。ORA-00060 是死锁还是竞争?先看日志里真正冲突的…...
gitru:一个由 Rust 打造的零依赖 Git 提交信息校验工具性
一、项目背景与核心价值 1. 解决的核心痛点 Navicat的数据库连接密码并非明文存储,而是通过AES算法加密后写入.ncx格式的XML配置文件中。一旦用户忘记密码,常规方式只能重新配置连接,效率极低。本项目只作为学习研究使用,不做其他…...
