设计模式:命令模式

news/2024/5/20 4:11:55

文章目录

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

一、什么是命令模式

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

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

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

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

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

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

二、命令模式结构

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

  • 命令(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://www.mrgr.cn/p/18365487

相关文章

线程理论篇1

本章问题:什么是线程?线程的使用场景?什么是线程池?线程池是如何工作的?线程池共享了哪些资源?线程安全代码怎么写?什么是线程安全? 什么是线程? 线程是为了提高进程的效率。进程的地址空间中保存了cpu…

Go pprof 认知到实践

快速开始 测试环境:go version go1.22.2 windows/amd64,源代码开源在 https://github.com/oldme-git/teach-study/tree/master/golang/base/pprof 在正式开始之前,请确保安装 graphviz,这一步不可省略,它可以协助 pprof 生成更直观的数据分析图。可以参考官方网站的安装方…

C#与PLC变量在数据交互上的一些探索

1. 基于C#的数据交互 A. S7,using S7.Net,后文读写数据时二次封装过S7协议,这里暂且不表,只列举S7协议最原始的应用。new一个PLC对象//idenfy basic link paramsprivate string plc_ip;private CpuType plc_type;private short plc_rack, plc_slot;public Plc my_plc;my_plc…

三角函数之诱导公式

壹如上图: \[\begin{eqnarray} 已知: \enspace AC=\sin\alpha,BC=\cos\alpha \\ \\ \\ \sin\left(\frac{\pi}{2}-\alpha\right)=\frac{AD}{AB}=\frac{BC}{AB}=\cos\alpha \\ \\ 诱导公式组0.1: \enspace \sin\left(\frac{\pi}{2}-\alpha\right)=\cos\alpha \\ \\ \\ \cos\left(…

解锁AI的神秘力量:LangChain4j带你步入智能化实践之门

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 在数字化转型的浪潮中,人工智能(AI)正逐渐成为推动企业创新和增长的关键力量。然而,将AI技术融入到日常业务流程并非易事,它…

ubuntu下多jdk环境轻松却换

在实际coding生活中,维护老项目与开发新项目常是并行的。快速企业java开发jdk版本,收首先要解决的问题。 今天看到一篇Blog,参考配置后完美实现了一键快速切换,nice!!!!!! 环境: 1、ubuntu 22 2、openjdk1.8、openjdk17 具体操作步骤: 1、安装openjdk(略),安装位…

CentOS 7 部署 NET6.0 项目过程

1、环境配置NET6.0 环境搭建主要是SDK 和 runtime 的安装,下图截自官网说明了SDK 和 runtime 的关系CentOS7 安装SDK 方法第一步:rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm第二部:yum install dotnet-sdk-6.0也可以只安装对应的…

接入大量设备后,视频汇聚系统EasyCVR安防监控视频融合平台是如何实现负载均衡的?

一、负载均衡 随着技术的不断进步和监控需求的日益增长,企业视频监控系统的规模也在不断扩大,接入大量监控设备已成为一项常态化的挑战。为确保企业能够有效应对这一挑战,视频汇聚系统EasyCVR视频融合平台凭借其卓越的高并发处理能力&#x…

软件杯 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &a…

细说夜莺监控系统告警自愈机制

虽说监控系统最侧重的功能是指标采集、存储、分析、告警,为了能够快速恢复故障,告警自愈机制也是需要重点投入建设的,所有可以固化为脚本的应急预案都可以使用告警自愈机制来快速驱动。夜莺开源项目从 v7 版本开始内置了告警自愈模块,本文将详细介绍告警自愈的原理和实现。…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度,还增强了用户界面的动态性和交互性,允许开发者将应用界面划分为多个独立、可重用的部分,每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】

HTMLCSS家乡河南主题网页目录 🍔涉及知识🥤写在前面🍧一、网页主题🌳二、页面效果Page1 首页Page2 开封游玩Page 3 开封美食Page4 留言 🌈 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 🐋四…

程序员副业创富:业余时间解锁首笔财富里程碑

在这个充满机遇的数字时代,我,一个普通的程序猿,编程爱好者,终于在云端源想这个平台上收获了属于我的第一桶金。这是一个关于兼职、学习与成长的故事,希望能激发同在编程路上的你,勇敢迈出那一步。 先晒晒我的首笔收入:一个普通的周末,我像往常一样,泡上一杯咖啡,坐在…

(一)文本分类经典模型之CNN篇

这篇blog对NLP领域的基本任务文本分类的CNN经典模型做了梳理CNN源于计算机视觉研究,后来诸多学者将其应用于短文本分类,其基本结构如下图所示:由上图可知,基于CNN的短文本分类模型,通常包括输入层、卷积层、池化层、全连接层和输出层五部分,其中卷积层和池化层是最为关键…

抖音小店是什么?它和直播带货有什么区别和联系?一篇详解!

大家好,我是电商糖果 在网上大家都说抖音的流量大,在抖音做电商比较赚钱。 可是有很多人对抖音电商并不了解。 甚至搞不懂抖音小店是什么?它和直播带货的区别和联系也不清楚。 下面,糖果就来给大家好好解答一下这个问题。 抖音…

Django 4.x 智能分页get_elided_page_range

Django智能分页 分页效果 第1页的效果 第10页的效果 带输入框的效果 主要函数 # 参数解释 # number: 当前页码,默认:1 # on_each_side:当前页码前后显示几页,默认:3 # on_ends:首尾固定显示几页&#…

Apache DolphinScheduler 3.3.0 版本重磅更新提前看!

Apache DolphinScheduler 3.3.0版本终于要在万众期待中发布啦!本次发版将有重大功能更新,包括架构上的调整。 为了让广大用户提前尝鲜,社区特别准备了直播活动提前揭秘3.3.0版本中的重要更新,到时候你将会了解到这些信息:3.3.0版本的工作流引擎改进 任务执行流程的优化 架…

激光雕刻优化:利用RLE压缩技术提高雕刻效率与节省能源成本

什么是 RLE ?RLE 在激光雕刻应用实现代码:总结 什么是 RLE ? RLE 是 Run-Length Encoding(游程长度编码)的缩写。这是一种数据压缩技术,它通过减少连续重复的数据来减小文件的大小。RLE 在图像处理、无损…

【重塑世界的火种】制造业:从匠人之心到智能未来之旅

在人类文明的宏伟乐章中,有一段旋律始终激昂,它既古老又现代,既是力量的象征,也是智慧的结晶——这就是制造业,一个将梦想变为现实,将创意铸就为生活的神奇领域。今天,让我们一起走进这个塑造世…

【触想智能】工业级平板电脑五大特征与应用领域分析

工业级平板电脑是专供工业环境使用的工业控制计算机,也被称为工控一体机。工业级平板电脑基本性能及兼容性与商用平板电脑几乎相同,但是工业级平板电脑更注重在不同环境下的稳定性能,因此,工业级平板电脑与普通的商用平板电脑存在一定的区别。一、工业级平板电脑的五大特征…