设计模式-命令模式

news2024/11/20 20:31:55

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作

命令模式( Command Pattern) 是对命令的封装,每一个命令都是一个操作:请求的一方 发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接 收方,请求方只需请求执行命令,不用关心命令是怎样被接收,怎样被操作以及是否被执行⋯等。
命令模式属于行为型模式。

命令模式的应用层场景

当系统的某项操作具备命令语义时,且命令实现不稳定(变化),那么可以通过命令模式解 耦请求与实现,利用抽象命令接口使请求方代码架构稳定,封装接收方具体命令实现细节。接 收方与抽象命令接口呈现弱耦合(内部方法无需一致),具备良好的扩展性。命令模式适用于 以下应用场景:

  1. 现实语义中具备 “命令”的操作(如命令菜单,shell 命令⋯);
  2. 请求调用者和请求的接收者需要解耦,使得调用者和接收者不直接交互;
  3. 需要抽象出等待执行的行为,比如撤销(Undo)操作和恢复(Redo)等操作;
  4. 需要支持命令宏(即命令组合操作)。

命令模式的UML类图

public interface ICommand {
    void execute();
}
复制代码
public class ConcreteCommand implements ICommand{
    private final Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
    }
}
复制代码
public class Receiver {
    public void action(){
        System.out.println("接收方接收到命令并执行");
    }
}
复制代码
public class Invoker {
    private final ICommand command;

    public Invoker(ICommand command) {
        this.command = command;
    }

    public void action(){
        command.execute();
    }
}
复制代码
public class Test {
    public static void main(String[] args) {
        ConcreteCommand concreteCommand = new ConcreteCommand(new Receiver());
        Invoker invoker = new Invoker(concreteCommand);
        invoker.action();
    }
}
复制代码

从上面的类图中就可以发现InvokerReceiver是没有耦合的,Invoker通过CommandReceiver建立联系的,这里 Invoker就相当于我们平时写业务中的一个业务逻辑的实现,你可以理解成是一个 service,而 Receiver相当于这个业务中的具体某个功能的实现,如果此时业务的需求需要变动,此时我们只需要更改CommandReceiver的应用或者为了符合开闭原则我们完全可以重新创建一个Command,对应者新的Receiver即可,这样对该对于我们整体的业务逻辑是没有改动的。

同时也可以结合装饰器模式,在原有的功能基础上增加一些其他的功能比如日志的收集等等,如果命令不是一个单独的命令而是一个命令的集合 Command会对应着多个命令,同时 Receiver也对应这多个方法,如果能对 Receiver进行抽象,这不就演变成了桥接模式,变成了command和Receiver两个变化的维度,这样扩展性更好

命令模式优缺点

优点:

  1. 通过引入中间件(抽象接口),解耦了命令请求与实现;
  2. 扩展性良好,可以很容易地增加新命令;
  3. 支持组合命令,支持命令队列;
  4. 可以在现有命令的基础上,增加额外功能(比如日志记录…,结合装饰器模式更酸爽)。

缺点:

  1. 具体命令类可能过多;
  2. 命令模式的结果其实就是接收方的执行结果,但是为了以命令的形式进行架构,解耦请求与实现,引入了额外类型结构(引入了请求方与抽象命令接口),增加了理解上的困难(不过这 也是设计模式带来的一个通病,抽象必然会引入额外类型;抽象肯定比紧密难理解)。

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

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

相关文章

DIDL1_基础优化算法

基础优化算法梯度下降选择学习率小批量随机梯度下降选择批量大小Batch_size总结梯度下降 挑选一个初始值w0w_0w0​重复迭代参数 t1,2,3 wtw_twt​等于上一个时刻wt−1w_t-1wt​−1减去一个(学习率标量和损失函数关于wt−1w_t-1wt​−1处的梯…

【20天快速掌握Python】day12-文件操作

1.文件的打开与关闭 想一想: 如果想用word编写一份简历,应该有哪些流程呢? 打开word软件,新建一个word文件 写入个人简历信息 保存文件 关闭word软件 同样,在操作文件的整体过程与使用word编写一份简历的过程是很相…

B树(B-树) [数据结构与算法][Java]

B树 B树又称为多路平衡树查找树, 是一种组织和维护外存文件系统非常有效的数据结构 因为我们的二分搜索树构建的时候很可能会出现不平衡的情况, 所以我们提出了自平衡二分搜索树(AVL树)对我们的普通的二分搜索树进行了一个优化, 而自平衡二分搜索树中当元素很多的时候树的高度…

Axure绘制密码输入框

当我们在绘制登录页面时,如果登录方式包含账号密码登录,那么我们就会使用到密 码输入框,而常见的密码输入框,通常会使用到小眼睛控制密码的明文和密文显示。 大家知道axure中的输入框,当你设置成密码类型时&#xff…

结构体内存对齐问题

结构体重点😃 1.结构体内存对齐问题,是在计算结构体的大小时,对结构体成员在内存中的位置进行研究的问题。 废话不多说,先看两个例子: 例题1: struct S1 {char c1;int age;char c2; };int main() {struc…

Spring Cloud Alibaba 2022.0.0.0 版本发布啦!

01新版本预览Aliware本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本,是基于社区 2022.x 主干分支进行构建发布第一个 Release Candidate(RC)版本,考虑到本次版本升级属于重大版本变更,因此暂时先以 RC 版本形式…

如何不改一行代码,让Hippy启动速度提升50%?

导读|Hippy使用JS引擎进行异步渲染,在用户从点击到打开首屏可交互过程中会有一定的耗时,影响用户体验。如何优化这段耗时?腾讯客户端开发工程师李鹏,将介绍QQ浏览器通过切换JS引擎来优化耗时的探索过程和效果收益。在分…

雷神科技在北交所上市首日破发:上半年业绩下滑,路凯林为董事长

12月23日,青岛雷神科技股份有限公司(下称“雷神科技”,BJ:872190)在北京证券交易所(即北交所)上市。本次上市,雷神科技的发行价为25.00元/股,发行数量为1250万股,发行后总…

2023春季招聘面试集锦:MYSQL数据库高频面试题

mysql索引的数据结构,各自优劣 索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B树索引等, InnoDB存储引擎的默认索引实现为:B树索引。对于哈希索引来说,底层的数据结构就是…

Dubbo(尚硅谷)学习笔记1

我们的dubbo需要一个注册中心也就是我们的zookeeper。 我们先把zookeeper搭建起来: 我这里是用的zookeeper3.3.4当然想用其它版本的也可以去官网去找。 我们运行这个文件: 第一次是会运行失败,所以我们还是找到这个文件 把下面的文件复制一…

小学生要学python开发游戏吗

小学生要学python开发游戏吗    小学生要学python开发游戏吗?为什么 而学, 到底需要如何做到, 又该如何学习. 就我个人来说, 小学生要学python开发游戏吗很有意义, 不能不说非常重大.    一般来讲, 我们都必须务必慎重的考虑考虑. 莎士比亚在不经意间这样说过&a…

qt plaintextedit使用_qt获取lineedit的内容

QLineEdit和QTextEdit都是文本框类,QLineEdit类是单行文本框控件,可以输入单行字符串。QTextEdit类是多行文本框控件,可以显示多行文本内容,当文本内容超出控件显示范围时,可以显示水平个垂直滚动条。QTextEdit不仅可以…

【工作流Activiti7】3、Activiti7 回退与会签

1. 回退(驳回) 回退的思路就是动态更改节点的流向。先遇水搭桥,最后再过河拆桥。 具体操作如下: 取得当前节点的信息取得当前节点的上一个节点的信息保存当前节点的流向新建流向,由当前节点指向上一个节点将当前节…

2022 年全球重大经济事件盘点( I )

2022 年,全球经济正面临百年未有之大变局,接踵而至的大事件造成今年行情剧烈波动,以往的投资逻辑不断遭遇修改。 正所谓阳光之下没有新鲜事。通过对于重大事件的复盘,分析了解过往历史脉络,投资者方能温故知新&#…

计算机视觉与图形学-神经渲染专题-

《Removing Objects From Neural Radiance Fields》链接:https://arxiv.org/pdf/2212.11966.pdf摘要神经辐射场 (NeRFs) 正逐步应用到场景表征的各个方向,来实现新颖视图的合成。NeRF 将越来越多内容与其他人共享。不过,在共享 NeRF 之前&…

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用

深入理解 Linux 零拷贝以及 Linux 中 I/O 的底层原理,在kafka、nginx、golang等等各种文件传输场景中不同的优化手段和实际应用。从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。 前言 存储器是计算机的核心部件之一,在完全理想的状态下,存…

搞定 Redis 数据存储原理,别只会 set、get 了

我的核心模块如图 1-10。 图 1-10 Client 客户端,官方提供了 C 语言开发的客户端,可以发送命令,性能分析和测试等。 网络层事件驱动模型,基于 I/O 多路复用,封装了一个短小精悍的高性能 ae 库,全称是 a si…

TIP2022|领域迁移Adaboost,让模型“选择”学哪些数据

论文下载:https://zdzheng.xyz/files/TIP_Adaboost.pdf 备份:https://arxiv.org/pdf/2103.15685.pdf 作者:Zhedong Zheng,Yi Yang 代码链接: GitHub - layumi/AdaBoost_Seg: TIP2022 Adaptive Boosting (AdaBoost) …

rescue-prime:基于Goldilocks域的Rescue-Prime 哈希函数加速

1. 引言 前序博客: Goldilocks域 所谓计算友好的哈希函数,是指: 基于素数域元素,而不是 通常的如SHA3-256/SHA256/BLAKE3中的raw bits/bytes/N-bit words。原因是,在STARK证明系统中,基于素数域的计算电…

三极管 vs MOS管 | PMOS与NMOS

三极管 与 MOS管 MOS管等效模型:电压控制(输入端G是电容);负载端D-S是小电阻,大电流时损耗小。 三级管等效模型:电流控制(输入端G是电阻);负载端是二极管,大…