设计模式:命令模式

文章目录

  • 一、什么是命令模式
  • 二、命令模式结构
  • 三、命令模式实现步骤
  • 四、命令模式应用场景

一、什么是命令模式

它允许将请求封装为对象,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。命令模式使得请求可以排队、记录、日志、存储和重放。

命令模式的主要优点包括:

  • 降低系统的耦合度:由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。
  • 新的命令可以很容易地添加到系统中:因为增加一个新的命令不会影响其他类,因此增加新的命令类很容易,无须修改原有系统类库的代码,甚至可以在不重新编译原有系统类库的情况下运行,即系统扩展性好。
  • 可以很容易地实现命令的撤销与恢复:只要把命令对象存储起来,在需要时调用执行即可实现命令的撤销与恢复,当然,这里的撤销与恢复并非撤销和重做命令所产生的结果,而是撤销与重放命令本身。
  • 在需要实现事务时,命令模式也有其独特的优点:当系统需要支持事务的时候,可以通过把命令对象放到一个事务队列中,等待系统处理事务的命令序列。

命令模式的主要缺点包括:

  • 可能导致某些系统有过多的具体命令类:因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这将影响命令模式的使用。

总的来说,命令模式是一种非常有用的设计模式,特别适用于需要将请求封装为对象、支持可撤销操作、或需要事务管理的场景。

二、命令模式结构

在这里插入图片描述
命令模式的主要参与者包括:

  • 命令(Command)接口:声明执行操作的接口。
  • 具体命令(ConcreteCommand)类:实现命令接口,将接收者的一个动作绑定其中。调用接收者相应的操作,以实现执行效果。
  • 请求者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这是真正发号施令者。
  • 接收者(Receiver):执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  • 客户端(Client):创建具体的命令对象,并且设置命令对象的接收者。在不是直接调用接收者的情况下,将命令对象传递给请求者来执行请求。

三、命令模式实现步骤

命令模式的实现步骤通常包括以下几个部分:

  • 定义命令接口
    首先,你需要定义一个命令接口,这个接口通常声明了一个执行方法(如execute())。例如,在Java中,你可以这样定义:
public interface Command {  void execute();  
}
  • 创建具体命令类
    然后,你需要创建具体的命令类,这些类实现了命令接口,并包含了接收者对象的引用。这些命令类将调用接收者的方法来完成实际的操作。
public class ConcreteCommand implements Command {  private Receiver receiver;  public ConcreteCommand(Receiver receiver) {  this.receiver = receiver;  }  @Override  public void execute() {  receiver.action(); // 调用接收者的方法  }  
}
  • 创建接收者
    接收者类通常包含实际要执行的操作。任何类都可以作为接收者,只要它能够执行命令所请求的操作。
public class Receiver {  public void action() {  // 执行操作  }  
}
  • 创建请求者
    请求者(Invoker)是发出命令请求的对象。它通常持有命令对象的引用,并可以通过调用命令对象的execute()方法来执行命令。
public class Invoker {  private Command command;  public Invoker(Command command) {  this.command = command;  }  public void call() {  command.execute(); // 调用命令的执行方法  }  
}
  • 在客户端中组装命令和接收者
    客户端负责创建具体的命令对象,并将接收者对象传递给命令对象。然后,客户端将命令对象传递给请求者,请求者通过调用命令对象的execute()方法来执行命令。
public class Client {  public static void main(String[] args) {  Receiver receiver = new Receiver();  Command command = new ConcreteCommand(receiver);  Invoker invoker = new Invoker(command);  invoker.call(); // 调用请求者的call方法,间接执行命令  }  
}

这就是命令模式的基本实现步骤。通过这种方式,你可以将请求者和接收者解耦,使得请求者不知道也不关心接收者的具体实现细节。同时,由于请求被封装为了命令对象,你可以很方便地对其进行存储、传递和组合等操作。

四、命令模式应用场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3019336.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【@ohos.events.emitter (Emitter)】

ohos.events.emitter (Emitter) 本模块提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。 说明: 本模块首批接…

zlib编译后静态库调用时遇到的无法解析的外部符号问题

编译zlib的静态库后引用到项目中使用,发现报下面的链接错误: error LNK2019: 无法解析的外部符号 _zlibVersion error LNK2019: 无法解析的外部符号 _deflateEnd error LNK2019: 无法解析的外部符号 _deflate error LNK2019: 无法解析的外部符号 _deflat…

什么牌子充电宝质量耐用且性价比高、充电宝性价比高品牌合集

在现代社会,手机几乎成了我们生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都离不开手机的陪伴。然而,随着手机使用频率的增加,电量焦虑也逐渐成为了我们共同面临的问题。出门时,我们可能会忘记带钱包&#…

已解决-你需要trustedinstaller权限才能执行此操作

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.解决方法 一.前言 我想删除C:\Windows\System32\drivers文件夹下面的内容,可是报错: 怎么办呢? 二.解决方法 右键要删除的文件

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门&#xf…

二手手机店需要用专业erp软件进行管理吗?

2024年在科技发展迅速的今天,手机批发和零售行业正迎来前所未有的革新。为了在这个变革中抓住机遇,提升竞争力,二手手机店需要寻找一种全面、高效、智能的管理工具。基于这个原因,超机商城为众多二手手机店商家量身打造的一款二手…

水电站泄洪安全声光预警广播系统建设方案

一、水电站泄洪安全声光预警广播系统建设方案背景 水电站建成运行以后,会使河道水文情势发生改变,为了加强水电站工程安全管理,保证水库泄洪放水工作安全有序进行,保护下游河道沿岸人民群众生命和财产安全,根据《中华…

DevSecOps 是什么?你知道吗?

使用工具自动进行安全检查和扫描。这些工具包括静态应用程序安全测试 (SAST)、动态应用程序安全测试 (DAST) 和依赖性扫描。 什么是 DevSecOps? DevSecOps 是 DevOps 实践的自然演进,其重点是将安全集成到软件开发和部署流程中。 DevSecOps 一词代表了…

elk + filebeat 8.4.3 收集nginx日志(docker部署)

ELK filebeat docker部署 一、 elasticsearch部署1、运行elasticsearch临时配置容器2、拷贝文件目录到本地3、检查elasticsearch.yml4、删除之前elastic,运行正式容器5、docker logs记录启动日志 二、部署kibana1、运行kibana临时配置容器2、docker拷贝配置文件到本…

MySQL —— 数据类型

一、数值类型 以上表格整理了用来表示数值类型的数据类型,其中,接下来将介绍和展示其中几个类型的使用和各种细节 1.tinyint 越界测试:建立一个包含tinyint类型的表格,插入各中数据去查看结果,并且尝试插入边界数据和…

论文润色就用意得辑:让你的学术之作更上一层楼

在学术的海洋里,每一篇论文都是一艘承载智慧与探索的小船。然而,好的内容也需要好的包装,才能更好地展现其价值。在这个追求精益求精的时代,意得辑以其专业的论文润色服务,成为了众多学者们的得力助手。 意得辑&#…

极致设计!详解专业网页设计的全套步骤和流程

在当今的数字时代,拥有一个专业、易于使用和有吸引力的网页对任何企业或个人都至关重要。专业的网页设计是实现这一目标的关键步骤之一。本文将详细介绍专业的网页设计步骤和过程,以帮助您了解如何设计一个优秀的网页。 在介绍专业网页设计步骤和流程之…

2024“跨境电商+产业带”高质量发展报告

来源:商务部研究院 经过二十多年的发展,我国跨境电商出口进入了深耕国内供应链的新阶段。“跨境电商产业带”是跨境电商对各地优势产业带全面赋能,推动特色产品出口,实现产业转型升级,培育自主​品牌的模式&#xff0…

echars 的一些运用

基础图形 // 支架压力数据量统计 let splitLine { // 网格线设置show:true,lineStyle:{color:#E2E7EC,width:1,}, } let itemStyle { // 柱形图颜色color:#5B9BD5, } let axisLine { // 轴线样式lineStyle:{color:#E2E7EC,}, } let axisLabel { // 轴刻度字-样式fontSize:…

MYSQL8.0.20安装教程

一:下载mysql MySQL :: Download MySQL Installer (Archived Versions) 二:选中server only,点击next 三:点击server 选项,点击Execute 弹窗点击安装 四:安装项为绿色后,点击next 五&#xf…

uniapp——点赞、取消点赞

案例 更新点赞状态&#xff0c;而不是每次都刷新整个列表。避免页面闪烁&#xff0c;提升用户体验 代码 <view class"funcBtn zan" click"onZan(index,item.id)"><image src"/static/images/circle/zan.png" mode"aspectFill&…

【新三个数排序的自创算法,这是我厉年来很满意的一次排序算法设计,最好小于O(N)最坏O((NN/3)/2)。】2024-5-7

缘由如何用C&#xff0b;&#xff0b;解决一下问题_编程语言-CSDN问答 int a[]{1, 4, 7, 8, 5, 2, 3, 6, 9, 7}, n 10, x n, jh 0, j 0;px:if (j < n) {//缘由https://ask.csdn.net/questions/8099444if (--x < 2 j)x n - 1, j 3;if (x < n - 1 && a[x…

技术分享 | i.MX8M Mini适配MIPI转eDP芯片

1.方案概述 此方案使用HD-8MMN-CORE的核心板搭配TI公司的芯片SN65DSI86转换芯片实现。 SN65DSI86作为一款MIPI DSI转eDP的芯片&#xff0c;支持双通道DSI输入&#xff0c;最大四通道显示输出&#xff0c;最大支持4K60fps输出&#xff0c;WUXGA 1080P。本方案中将采用单通道DS…

winscp断点续传

背景 超大文件上传&#xff0c; scp可能因为网络或其他原因中断&#xff0c;并且已上传完的文件无法同步。如何断点续传呢&#xff1f;使用winscp软件 winscp安装 百度搜索&#xff0c;自行安装 开启断点续传功能 https://jingyan.baidu.com/article/fdffd1f8395529b2e98ca…

什么可以替代iframe?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…