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

Java命令模式:让请求成为对象

Java命令模式:让请求成为对象

在软件设计中,我们经常遇到需要将操作或请求封装成对象的情况。这样,我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中,一个请求或操作被封装成一个对象,从而使您可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

一、命令模式的结构

命令模式涉及以下几个关键角色:

  1. Command(命令):这是一个接口,用于声明执行操作的接口。
  2. ConcreteCommand(具体命令):这是实现了Command接口的具体类。它包含一个接收者对象,并在执行方法中被调用。
  3. Receiver(接收者):这是知道如何执行与该请求相关的操作的对象。任何类都可能作为一个接收者。
  4. Invoker(调用者):这是要求命令对象执行请求的对象。它通常会持有一个命令对象,并可以存储命令的撤销状态。
  5. Client(客户端):这是创建具体命令对象并设置其接收者的对象。

二、Java实现命令模式

下面是一个简单的Java示例,展示了如何使用命令模式:

// Command 接口
public interface Command {void execute();void undo();
}// ConcreteCommand 类
public class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();}@Overridepublic void undo() {receiver.undoAction();}
}// Receiver 类
public class Receiver {public void action() {System.out.println("执行操作");}public void undoAction() {System.out.println("撤销操作");}
}// Invoker 类
public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}public void undoCommand() {command.undo();}
}// 客户端代码
public class Client {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.executeCommand(); // 输出:执行操作invoker.undoCommand();    // 输出:撤销操作}
}

三、命令模式的优点

  1. 解耦:命令模式将请求的发送者与接收者解耦,使得请求的发送者不需要知道如何执行请求,也不需要知道请求的接收者是谁。
  2. 队列请求:命令模式支持将请求排队,从而实现操作的延迟执行或日志记录。
  3. 支持撤销:通过实现一个撤销方法,命令模式可以支持撤销操作,这在许多应用中是非常有用的。
  4. 灵活性:由于命令对象可以被参数化,因此你可以在不改变其他代码的情况下,通过替换不同的命令对象来改变系统的行为。

四、总结

命令模式是一种非常强大且灵活的设计模式,它允许你将请求或操作封装成对象。通过将请求的发送者与接收者解耦,命令模式提供了高度的灵活性和可扩展性。无论是在GUI应用中处理用户操作,还是在服务器端处理复杂的业务逻辑,命令模式都能帮助你构建更加清晰、可维护和可扩展的代码结构。

相关文章:

Java命令模式:让请求成为对象

Java命令模式:让请求成为对象 在软件设计中,我们经常遇到需要将操作或请求封装成对象的情况。这样,我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中,一个请求或操作被封装成…...

研究生摆烂摆烂的一个寒假

寒假:27-24,不到一个月 刚回家,不想学习,摆烂 想学了,又过年了,于是又开摆 又想学了,家里面有有点小事,于是又开摆 摆完,没想到就返校啦 期末作业没完成&#xff08…...

singularity-ce-4.1.0 + go 完整安装步骤,及报错解决

singularity-ce-4.1.0 + go 1.20 完整安装步骤. 解决bug: checking: host Go compiler (at least version 1.13)... not found! mconfig: could not complete configuration服务器基础环境: 阿里云服务器: => lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-n…...

笔记-电感充放电过程状态记录

描述:电感充放电过程状态记录 为加深对电感充放电的理解,特做一次记录。 目录 一、准备工作二、电感状态记录1、电感刚开始充电瞬间2、电感充电期间3、电感充电完毕4、电感开始放电瞬间5、电感放电完毕6、电感充放电完整记录 一、准备工作 1、在线平台…...

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优…...

《卓有成效的管理者》

前言 管理工作在很大程度上是要言传身教的,如果管理者不懂得如何在自己的工作中做到卓有成效,就会给其他人树立错误的榜样。 第 1 章 卓有成效是可以学习的 关于体力工作,我们已有一套完整的衡量方法和制度,从工程设计到质量控制…...

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…...

学生个性化成长平台搭建随笔记

1.Vue的自定义指令 在 Vue.js 中,我们可以通过 Vue.directive() 方法来定义自定义指令。具体来说,我们需要传递两个参数: 指令名称:表示我们要定义的指令名称,可以是一个字符串值,例如:has-rol…...

XTuner InternLM-Chat 个人小助手认知微调实践

要解决的问题: 如何让模型知道自己做什么,是什么样身份。是谁创建了他!!! 概述 目标:通过微调,帮助模型认清了解对自己身份弟位 方式:使用XTuner进行微调 微调前(回答…...

编程笔记 Golang基础 025 列表

编程笔记 Golang基础 025 列表 一、列表的功能二、示例程序三、注意事项 在 Go 语言中,列表是一种数据结构,用于存储有序的元素集合,允许高效地进行插入和删除操作。Go 标准库中的 container/list 包提供了一个内置的双链表实现,它…...

Rollup + Ts

Rollup Ts RollupTs demo 一、文件配置 | - src | | - utils | | | - .ts | | - .babelrc | | - main.js | | - style.css | - package.json | - rollup.config.js | - tsconfig.json二、插件下载 rollup // rollup 基本的包 typescript // ts 包 rollup/plug…...

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板,适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题,适合用于搭建教育培训公司官方…...

【数据分享】2011-2023年我国地级市逐月二手房房价数据(Excel/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据! 本次我们为大家带来的是2011-2023年我国地级市的逐月二手…...

鸿蒙会成为安卓的终结者吗?

随着近期鸿蒙OS系统推送测试版的时间确定,关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统,鸿蒙给人的第一印象是具有颠覆性。 早在几年前,业内就开始流传鸿蒙可能会代替Android的传言。毕竟,Android作为开源系统&…...

Sora横空出世!AI将如何撬动未来?

近日,OpenAI 发布首个视频生成“Sora”模型,该模型通过接收文字指令,即可生成60秒的短视频。 而在2022年末,同样是OpenAI发布的AI语言模型ChatGPT,简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…...

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google C…...

XGB-11:随机森林

XGBoost通常用于训练梯度提升决策树和其他梯度提升模型。随机森林使用与梯度提升决策树相同的模型表示和推断,但使用不同的训练算法。可以使用XGBoost来训练独立的随机森林,或者将随机森林作为梯度提升的基模型。这里我们专注于训练独立的随机森林。 XG…...

超平面介绍

超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两部分;三维空间中,一个平面是二维的,它把空间分成了两部分。(2…...

【苍穹外卖】一些开发总结

1、DTO、VO的区别 DTO:如果前端返回的实体类和对应的实体类比较较大差别 使用DTO来封装数据 后面在使用 BeanUtils.copyProperties() 将熟悉复制到对应的实体类中 VO:主要用于展示数据,例如在控制器层和视图层之间。它通常包含一些与显示相关的属性,如标题、描述等。 2…...

Python 3 中,`asynchat`异步通信

在 Python 3 中,asynchat 是基于 asyncore 的一个高层抽象模块,用于处理异步通信协议。它提供了一种简单的方式来创建自定义的异步通信协议,并处理通信中的错误和异常。 asynchat 模块主要作用是将网络数据流分割成消息或者数据包&#xff0…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...