Java设计模式【命令模式】-行为型

news/2024/9/20 1:28:32/ 标签: java, 设计模式, 命令模式

1. 介绍

命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使我们可以用不同的请求对客户端进行参数化,并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与执行者分离,使两者独立变化。

命令模式包含以下几个关键角色:

  • 命令(Command):定义执行命令的接口,通常包含一个execute()方法。
  • 具体命令(Concrete Command):实现命令接口,负责调用接收者的相关操作。
  • 接收者(Receiver):执行具体操作的逻辑。
  • 调用者(Invoker):持有命令对象,并通过调用命令对象的execute()方法,来触发命令的执行。
  • 客户端(Client):负责创建具体的命令对象,并将其传递给调用者。

1.1 优缺点

优点:

  • 解耦请求的发送者和执行者命令模式将请求的发送者和执行者解耦,发送者不需要知道执行者的存在及其实现细节。
  • 可扩展性强:通过引入新的命令类,可以轻松扩展系统功能而不影响其他部分。
  • 支持撤销和重做操作命令模式支持记录命令,从而可以实现撤销、重做等操作。
  • 支持组合命令:可以将多个命令组合在一起,构成一个复合命令,以便一次执行多个操作。

缺点:

  • 增加系统复杂性:每个操作都需要设计一个命令类,可能导致系统中的类数量大幅增加。
  • 命令链的维护:如果存在复杂的命令链,可能需要额外的管理工作。

2. 应用场景

命令模式适用于以下场景:

  • 需要解耦请求的发送者和执行者:发送请求的对象不应直接依赖执行请求的对象。
  • 支持撤销和重做功能:需要保存执行记录,并支持回滚操作。
  • 需要日志记录或事务管理命令模式可以记录每一个请求及其执行状态,便于后续处理。
  • 宏命令(组合命令):需要一次执行一组命令时,使用命令模式可以方便地管理和执行多个命令。

3. Java实现示例

以下是一个简单的命令模式的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是接收者,LightOnCommandLightOffCommand是具体命令,而RemoteControl是调用者。客户端通过设置命令来控制灯的状态。

4. Spring中使用场景

在Spring框架中,命令模式应用在以下几个地方:

  • Spring的事务管理(Transaction Management):Spring的事务管理中,命令模式用于封装事务执行逻辑。例如,在执行数据库操作时,PlatformTransactionManager可以看作是一个命令接口,事务操作是具体的命令实现。
  • Spring Batch:Spring Batch框架使用了命令模式来处理批量任务中的执行步骤。每个任务步骤可以看作是一个命令,执行时调用相应的命令来完成具体操作。
  • Spring的事件处理机制:Spring的事件驱动模型中,事件的发布和处理类似于命令模式。发布者(调用者)触发事件,而事件监听器(接收者)执行相应的处理逻辑。

5. 总结

命令模式通过将请求封装为对象,使得请求的发送者与执行者解耦,提供了一个灵活、可扩展的设计模式。它不仅支持撤销和重做,还能将多个命令组合起来进行批量处理,适用于需要复杂操作管理和扩展性的场景。

虽然命令模式可能会增加系统的复杂性,但它在解耦、扩展、撤销、重做等方面的优势,使得它成为软件设计中的常用模式。在Spring中,命令模式被应用于事务管理、批处理任务和事件驱动机制等多个场景,帮助开发者简化请求的处理流程并提高代码的复用性。

4o


http://www.ppmy.cn/news/1523455.html

相关文章

JavaScript高级——函数

1、函数的含义: ① 实现特定功能的n条语句的封装体。 ② 只有函数是可以执行的,其他类型的数据不能执行。 2、为什么要用函数? ① 提高代码复用 ② 便于阅读交流 3、如何定义函数? ① 函数声明 ② 表达式 4、如何调用&#…

vue3+ant design vue实现文件上传(阿里云oss)~

1、效果图 2、自定义上传 <a-upload v-model:file-list"fileList" name"导入员工" action"" :customRequest"upDown" :beforeUpload"beforeUpload" :onChange"handleChange" remove"removeFile" ac…

使用MATLAB进行动力学分析与可视化

目录 一、动力学与MATLAB概述 二、动力学系统的建模 1. 简谐振子 2. 单摆 三、动力学系统的仿真 1. 使用ode45求解简谐振子 2. 使用ode45求解单摆 四、动力学结果的可视化 1. 二维曲线图 2. 相空间图 3. 三维曲面图 4. 动画制作 五、复杂动力学系统的建模与仿真 1…

数据恢复的基石:MySQL中的存储管理策略

在企业数据管理中&#xff0c;数据恢复的存储管理是确保数据安全和业务连续性的关键环节。MySQL作为广泛使用的数据库系统&#xff0c;其数据恢复的存储管理对于优化备份存储、提高恢复效率和保障数据完整性至关重要。本文将深入探讨如何在MySQL中实现数据恢复的存储管理&#…

OpenCV仿射变换和透视变换函数(C++)

文章目录 引言图像仿射变换 warpAffine()图像的旋转仿射变换 透视变换 warpPerspective()透视变换例子参考文献 **仿射变换相关函数** cv::transform()&#xff1a;对一组点进行仿射变换 cv::warpAffine()&#xff1a;对整幅图像进行仿射变换 cv::getAffineTransform()&#xf…

Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误

在pro文件中添加以下配置即可&#xff1a; msvc{QMAKE_CFLAGS /utf-8QMAKE_CXXFLAGS /utf-8 }

Flask中的上下文(Context)

Flask中的上下文&#xff08;Context&#xff09;是一个核心概念&#xff0c;它对于理解和使用Flask框架进行Web开发至关重要。上下文在编程中通常指的是程序执行到某一时刻时&#xff0c;环境所提供的一系列状态信息&#xff0c;这些状态信息可以是变量、函数、类等&#xff0…

[Redis] Redis中的String类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【机器学习】12. 线性回归 Residual 残差系数 R方

Sum of Squares Total (SST) 单个数据点&#xff08;观测值&#xff09;于响应变量的均值差的平方和。 Sum of Squares Regression (SSR) 预测值ŷi与响应变量均值差的平方和。 Sum of Squares Error (SSE) 预测值ŷi与观测值差的平方和。 R 2 1 − S S E / S S T S S R / …

前端技术(七)——less 教程

一、less简介 1. less是什么&#xff1f; less是一种动态样式语言&#xff0c;属于css预处理器的范畴&#xff0c;它扩展了CSS语言&#xff0c;增加了变量、Mixin、函数等特性&#xff0c;使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 &#xff0c;也可以借助Node.js在服…

一台笔记本电脑的硬件都有哪些以及对应的功能

一台笔记本电脑的硬件通常包括多个关键组件&#xff0c;这些组件共同协作&#xff0c;确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能&#xff1a; 1. 中央处理器&#xff08;CPU&#xff09; 功能&#xff1a;CPU 是电脑的“大脑”&#xff0c;负责处理所有的计算…

bit-fields 生成macros

‌Bit-Fields Macros定义‌ Bit-fields macros是在C或C语言中&#xff0c;‌利用宏定义&#xff08;‌macros&#xff09;‌来方便地创建和操作位字段&#xff08;‌bit-fields&#xff09;‌的一种方式。‌位字段常用于节省内存&#xff0c;‌通过在一个字节中打包多个布尔值或…

【PHP小课堂】简单入门PHP中的过滤器相关函数

简单入门PHP中的过滤器相关函数 一般在业务开发中&#xff0c;我们对于一些参数数据的过滤大部分还是使用传统的 if 以及正则进行判断过滤。但其实 PHP 中也提供了一些过滤器&#xff0c;可以帮助我们方便地进行数据的过滤筛选以及部分替换操作。今天我们就来简单的学习一下这些…

设计模式之状态模式 (C++ 实现)

设计模式是软件开发中的一项重要技能&#xff0c;它提供了一种通用的解决方案以应对不同的设计问题。状态模式是一种行为型设计模式&#xff0c;适用于对象在不同状态下表现出不同的行为。通过实现状态模式&#xff0c;可以让代码更清晰、更易扩展与维护。本文将通过C实现状态模…

【开发工具】Maven Dependency Helper:IntelliJ IDEA的贴心助手,助力梳理依赖关系

一、引言 在Java项目开发过程中&#xff0c;依赖管理是一个至关重要的环节。Maven作为一个优秀的构建工具&#xff0c;已经成为了Java项目标配。然而&#xff0c;在管理项目依赖时&#xff0c;我们常常会遇到各种问题&#xff0c;如依赖冲突、依赖版本不兼容等。为了让开发者更…

菜鸟养成记第10集(滑窗算法)

固定窗口 示例 假设有一个数组 nums [1, 3, -1, -3, 5, 3, 6, 7]&#xff0c;我们需要找到长度为 3 的最大子数组之和。 nums [1, 3, -1, -3, 5, 3, 6, 7] window_size 3 max_sum float(-inf)for i in range(len(nums) - window_size 1):current_sum sum(nums[i:i wi…

华为OD机试 - 最大相连男生数 - 矩阵(Java 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

数据结构代码集训day16(适合考研、自学、期末和专升本)

本题来自B站up&#xff1a;白话拆解数据结构 今日题目就一个&#xff1a;约瑟夫环问题。 一个圈共有N个人&#xff08;N为不确定的数字&#xff09;&#xff0c;第一个人的编号为0或者1&#xff08;两个都可以&#xff0c;看你的程序如何编写&#xff09;&#xff0c;假设这边我…

通过SSH服务远程操作Linux(ubuntu)主机

首先SSH是什么&#xff1f;SSH&#xff08;Secure SHell&#xff09;是Linux、Unix、Mac及其他网络设备最常用的远程CLI管理协议&#xff0c;SSH使用秘钥对数据进行加密&#xff0c;保证了远程管理数据的安全性。Secure Shell (SSH) 是一种网络协议&#xff0c;允许用户通过加密…

算法设计与分析第一堂课笔记复习

算法是解决问题的一种方法或一个过程&#xff0c;是由若干条指令组成的又穷序列&#xff0c; 算法的性质 输入&#xff1a;有零个或多个输出&#xff1a;“至少一个”确定性&#xff1a;组成算法的每条指令清晰无歧义有限性&#xff1a;算法中每条指令和执行次数和执行时间都是…