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

【设计模式系列】命令模式

目录

一、什么是命令模式

二、命令模式的角色

三、命令模式的典型应用场景

四、命令模式在Runnable中的应用


一、什么是命令模式

命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象。这个模式提供了一种机制,使得你可以将操作的发出者(发起请求的对象)和操作的执行者(接收请求的对象)解耦同时允许你根据不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

二、命令模式的角色

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

  1. Command(命令接口)

    • 定义命令的接口,通常至少包含一个 execute() 方法,用于执行命令。
  2. ConcreteCommand(具体命令类)

    • 实现命令接口,对应于具体的行为和接收者的绑定。它内部持有接收者(Receiver)的引用,并在 execute() 方法中调用接收者的方法。
  3. Invoker(调用者)

    • 要求命令对象执行请求。调用者持有命令对象,并在某个时刻调用命令对象的 execute() 方法。
  4. Receiver(接收者)

    • 知道如何实施与执行一个请求相关的操作。它执行与命令相关的实际工作。

三、命令模式的典型应用场景

  1. 解耦操作调用者和执行者: 在系统需要高度解耦的场景中,命令模式可以将发起操作的对象(调用者)和执行操作的对象(接收者)分开,增加系统的灵活性。

  2. 分布式系统: 在分布式系统中,命令模式可以用来封装远程调用,使得远程调用像本地调用一样简单。

四、命令模式在Runnable中的应用

Runnable 接口在 Java 中是一个函数式接口,它只有一个方法 run()。虽然 Runnable 本身并不是一个命令模式的实现,但它经常被用来模拟命令模式的行为。在命令模式中,Runnable 可以作为一个命令对象,封装了要执行的操作。

以下是 Runnable 在命令模式中的一个应用示例:

  1. 命令接口(Command): 在 Java 中,这通常是一个包含 execute() 方法的接口。

  2. 具体命令类(ConcreteCommand): 实现命令接口的类,它的 execute() 方法会调用 Runnablerun() 方法。

  3. 调用者(Invoker): 一个对象,它持有命令对象,并在需要时调用命令对象的 execute() 方法。

Runnable 在命令模式使用示例:

// 命令接口
interface Command {void execute();
}// 具体命令类
class ConcreteCommand implements Command {private Runnable runnable;public ConcreteCommand(Runnable runnable) {this.runnable = runnable;}@Overridepublic void execute() {runnable.run();}
}// 调用者
class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void executeCommand() {command.execute();}
}// Runnable 实现
class Task implements Runnable {@Overridepublic void run() {System.out.println("Task is running");}
}// 客户端代码
public class Client {public static void main(String[] args) {Task task = new Task();Command command = new ConcreteCommand(task);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.executeCommand(); // 输出:Task is running}
}

在这个例子中,Task 是一个实现了 Runnable 接口的类,它封装了一个任务。ConcreteCommand 是一个具体命令类,它持有一个 Runnable 对象,并在 execute() 方法中调用 Runnablerun() 方法。Invoker 是调用者,它持有命令对象,并在适当的时候执行命令。这样,Runnable 就充当了命令模式中的命令对象,封装了要执行的操作。

相关文章:

【设计模式系列】命令模式

目录 一、什么是命令模式 二、命令模式的角色 三、命令模式的典型应用场景 四、命令模式在Runnable中的应用 一、什么是命令模式 命令模式(Command Pattern)是一种行为设计模式,它将一个请求或简单操作封装为一个对象。这个模式提供了一种…...

uniapp中使用lottie实现JSON动画

uniapp中使用lottie实现JSON动画 不喜欢废话直接开干一、引入相关依赖二、在项目的目录新建目录结构三、操作步骤四、编写自定义组件代码五、组件的使用提一嘴更多lottie-web常用方法添加点击事件 不喜欢废话直接开干 一、引入相关依赖 npm install lottie-web # 如果有问题可…...

AcWing275

题目重述 这道题的核心是利用方格取数模型的思想,将两条路径的传递过程映射为同时出发的两条路径,避免重复格子的经过。题解通过以下步骤解题: 路径映射:从 (n, m) 回到 (1, 1) 的路径,可以转换成 (1, 1) 到 (n, m) …...

Windows系统部署redis自启动服务【亲测可用】

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...

深入了解机器学习 (Descending into ML):线性回归

人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录。Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您,并邀请您自己利用该数据库训练一…...

每日OJ题_牛客_集合_排序_C++_Java

目录 牛客_集合_排序 题目解析 C代码 Java代码 牛客_集合_排序 集合_牛客题霸_牛客网 (nowcoder.com) 题目解析 笔试题可直接用set排序&#xff0c;面试可询问是否要手写排序函数&#xff0c;如果要手写排序&#xff0c;推荐写快排。 C代码 #include <iostream> …...

鸿蒙网络编程系列27-HTTPS服务端证书的四种校验方式示例

1. 服务端数字证书验证的问题 在鸿蒙客户端对服务端发起HTTPS请求时&#xff0c;如果使用HttpRequest的request发起请求&#xff0c;那么就存在服务端数字证书的验证问题&#xff0c;你只有两个选择&#xff0c;一个是使用系统的CA&#xff0c;一个是使用自己选定的CA&#xf…...

scala继承

Scala中继承的定义为在原有类的基础上定义一个新类&#xff0c;原有类称为父类&#xff0c;新类称为子类。 当子类从父类中继承的方法不能满足需要时&#xff0c;子类需要有自己的行为&#xff0c;怎么办&#xff1f; 此时使用override可以重写父类方法。 class Aniaml(){va…...

【Hive】2-Apache Hive概述、架构、组件、数据模型

Apache Hive概述 什么是Hive Apache Hive是一款建立在Hladoop之上的开源数据仓库系统&#xff0c;可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为Hive查询语言(HQL)&#xff0c;用于访…...

关于目前面试八股文的一些心得体会

现在是2024年10月&#xff0c;自22年开始&#xff0c;明显感觉到整个计算机行业&#xff0c;越来越卷了。一方面&#xff0c;随着信息的传播&#xff0c;越来越多的新人涌入了这个赛道&#xff0c;另一方面&#xff0c;众所周知的原因&#xff0c;不管大厂还是小厂在经历寒冬之…...

大数据-178 Elasticsearch Query - Java API 索引操作 文档操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

PHP(一)从入门到放弃

参考文献&#xff1a;https://www.php.net/manual/zh/introduction.php PHP 是什么&#xff1f; PHP&#xff08;“PHP: Hypertext Preprocessor”&#xff0c;超文本预处理器的字母缩写&#xff09;是一种被广泛应用的开放源代码的多用途脚本语言&#xff0c;它可嵌入到 HTML…...

基于深度学习的生物启发的学习系统

基于深度学习的生物启发学习系统&#xff08;Biologically Inspired Learning Systems&#xff09;旨在借鉴生物大脑的结构和学习机制&#xff0c;设计出更高效、更灵活的人工智能系统。这类系统融合了生物神经科学的研究成果&#xff0c;通过模仿大脑中的学习模式、记忆过程和…...

10_实现readonly

在某些时候&#xff0c;我们希望定义一些数据是只读的&#xff0c;不允许被修改&#xff0c;从而实现对数据的保护&#xff0c;即为 readonly 只读本质上也是对数据对象的代理&#xff0c;我们同样可以基于之前实现的 createReactiveObject 函数来实现&#xff0c;可以为此函数…...

简单介绍$listeners

$listeners 它可以获取父组件传递过来的所有自定义函数&#xff0c;如下&#xff1a; // 父组件 <template><div class"a"><Child abab"handleAbab" acac"handleAcac"/></div> </template><script> impor…...

架构设计笔记-20-补充知识

知识产权 我国没有专门针对知识产权制定统一的法律(知识产权法)&#xff0c;而是在民法通则规定的原则下&#xff0c;根据知识产权的不同类型制定了不同的单项法律及法规&#xff0c;如著作权法、商标法、专利法、计算机软件保护条例等&#xff0c;这些法律、法规共同构成了我…...

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…...

PDH稳频技术粗谈

PDH&#xff08;Plesiochronous Digital Hierarchy&#xff09;是一种传输技术&#xff0c;主要用于数字通信中的传输系统。PDH稳频技术是指在PDH传输系统中&#xff0c;通过稳定频率来实现传输系统的稳定性和可靠性。 PDH传输系统中&#xff0c;时钟同步是非常重要的。传输系…...

[LeetCode] 130. 被围绕的区域

题目描述&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O 组成&#xff0c;捕获 所有 被围绕的区域&#xff1a; 连接&#xff1a;一个单元格与水平或垂直方向上相邻的单元格连接。区域&#xff1a;连接所有 O 的单元格来形成一个区域。围绕&#x…...

C语言位运算

目录 1.C语言位运算符表 2.C语言移位运算符详解&#xff08;配实例作业&#xff09; 3.C语言&按位与运算符详解 4.C语言|按位或运算符详解 5.C语言^按位异或运算符详解 6.C语言~取反运算符详解 C语言位运算这一章主要介绍C语言位运算符表、C语言移位运算符、C语言&按…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...