设计模式21——命令模式

news2024/11/17 11:40:50

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

命令模式(Command)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图和上方概述里的一样:

2.2、Java代码如下:


一、概述

1、将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
2、可以在 根据请求执行命令的类 里、设计一个命令队列,把 声明接收者执行哪些命令的类 保存起来;
3、允许接受请求的一方拒绝请求。

1.1、直观的理解

其中 ConcreteCommandA 和 ConcreteCommandB 是达到 此模式的目标功能 的重要载体。它把每次的请求都包装到自己独立的实例对象中,也就是说一个ConcreteCommand实例对象包括了一次请求的详细信息,那么我们通过这个对象保存的信息,就能够实现撤销、排队、拒绝等一系列需求了。

1.2、主要角色:

  • Command---声明接收者执行哪些命令的类:声明接收者执行哪些命令的类的抽象类和接口声明接收者执行哪些命令的类调用接收者相应操作,以实现请求
  • Invoker---根据请求执行命令的类:要求Command执行请求
  • Receiver---接收者:有所有请求或命令相关的操作
  • 请求发起者:创建一个具体命令对象并设定他的接收者,然后发起请求

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 抽象出待执行的动作以参数化某对象。参数化的用处如:回调(先将函数在某处注册,而他在稍后的某个时间运行)。
  • 在不同时刻指定、排列和执行请求
  • 支持取消操作
  • 支持修改日志
  • 用构建在原语操作上的高层操作构造一个系统

二、简单举例

现有两个操作A和B,刚好对应两个请求A和B。这个例子比较简单,不能直观体验到命令模式带来的好处,比如他的功能有:取消请求、给请求排队、记录请求等,这些我暂时不分别演示了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图和上方概述里的一样:

2.2、Java代码如下:

声明接收者执行哪些命令的类:

//声明接收者执行哪些命令的类
abstract class Command {
    protected Receiver receiver;

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

    public abstract void executeCommand();
}

声明接收者执行哪些命令的类A:

public class ConcreteCommandA extends Command {
    public ConcreteCommandA(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        System.out.println("对请求A的响应");
        this.receiver.actionA();
    }
}

声明接收者执行哪些命令的类B:

public class ConcreteCommandB extends Command {
    public ConcreteCommandB(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        System.out.println("对请求B的响应");
        this.receiver.actionB();
    }
}

根据请求执行命令的类:

//根据请求执行命令的类
public class Invoker {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        command.executeCommand();
    }
}

接收者:

//接收者
public class Receiver {
    public void actionA() {
        System.out.println("接收者执行A!");
    }
    public void actionB() {
        System.out.println("接收者执行B!");
    }
}

主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Invoker invoker = new Invoker();


        invoker.setCommand(new ConcreteCommandA(receiver));//填装
        invoker.executeCommand();//发出命令A


        invoker.setCommand(new ConcreteCommandB(receiver));//填装
        invoker.executeCommand();//发出命令B
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

mysql连接不上可能的原因:防火墙放行mysql的3306端口 全库复制:data目录替换即可 mysql查看版本

1.看本地localhost能否连接 2.在本地看IP能否连接 能说明本地正常 权限也够 都能的话,ip能否ping通 能就说明可能是防火墙原因了。关闭防火墙及杀毒试试。 我这里关防火墙就能访问了。 windows如何开启防火墙,又放行mysql的3306端口? 在 …

盘点韩语中的四字成语柯桥留学韩语学习外语培训

일석이조 一石二鸟 일거양득 一举两得 호장성세 虚张声势 새옹15857575376#지마 塞翁失马 간담상조 肝胆相照 이심전심 心心相印 동고동락 同甘共苦 외유내강 外柔内刚 입신양명 扬名立万 다다익선 多多益善 거두절미 截头去尾 일사천리 一泻千里 자유자재 自由自在 탁상공

操作系统总结6

目录 3.2.1 虚拟内存的基本概念 (1)知识总览 ​编辑(2)传统管理方式的特征、缺点 (3)局部性原理 (4)虚拟内存的定义和特征 (5)如何实现虚拟内存技术 总…

IO系列(九) -什么是零拷贝

一、摘要 相信不少的网友,在很多的博客文章里面,已经见到过零拷贝这个词,会不禁的发出一些疑问,什么是零拷贝? 从字面上我们很容易理解出,零拷贝包含两个意思: 拷贝:就是指数据从…

记录贴 Elasticsearch的RestClient进行DSL查询

must:必须匹配每个子查询,类似“与” should:选择性匹配子查询,类似“或” must_not:必须不匹配,不参与算分,类似“非” filter:必须匹配,不参与算分 import cn.huto…

nginx+keepalived实现nginx高可用集群

实现nginx的高可用 一、简要介绍 ​ nginx作为一款企业级的代理服务器,在各种企业事业单位中,均有广泛的使用,尤其是在前后端分离的项目中,nginx作为路由转发的功能是非常常用的。在一些流量比较大的项目中,为了应对…

idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)

文章目录 新建一个项目添加web支持配置tomcat优化tomcat的部署运行tomcatidea数据库连接java连接数据库 新建一个项目 new project;Java;选择jdk的版本;next;next;填写项目名字,选择保存的路径;…

raid 磁盘阵列

raid 磁盘阵列: **条带化存储:**数据分散在多个物理磁盘上的存储方式。利用多个磁盘并行读取和写入。 条带化的存储性能和读写性能是最好的。 磁盘的组成方式不同,也就是不同的raid级别: **raid 0(条带化存储&#x…

.net JQ AJAX 请求 FromBody 接收格式

$.ajax({ url: “/api/banchang/EmpTble/Login2”, type: ‘Post’, data: JSON.stringify({ Emppassword: pass, EmpName: name }), contentType: ‘application/json’, beforeSend: function () { // 禁用按钮防止重复提交 /* $(“#create”).attr({ disabled: “disabled”…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目,使用Postman测试 参考博文: 1、使用…

短视频脚本创作的五个方法 沈阳短视频剪辑培训

说起脚本,我们大概都听过影视剧脚本、剧本,偶尔可能在某些综艺节目里听过台本。其中剧本是影视剧拍摄的大纲,用来指导影视剧剧情的走向和发展,而台本则是综艺节目流程走向的指导大纲。 那么,短视频脚本是什么&#xf…

服务器端请求伪造--SSRF

SSRF 简介 ##SSRF定义 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由 攻击者构造形成,由服务端发起请求 的一个安全漏洞。一般情况下,SSRF攻击的目标是从 外网无法访问的内部系统(正是因为它是由服务端发起的,所…

FineReport帆软设计器,远程连接服务器

FineReport报表工具一款纯Java编写的企业级web报表软件工具。它能够全面支持主流的B/S架构以及传统的C/S架构,部署方式简单而灵活. 需要使用FineReport帆软设计器,配置远程服务器的方式如下: 1、打开帆软设计器,点击文件&#x…

工程项目管理系统的Java实现:高效协同与信息共享

在当今的工程领域,项目管理的高效协同和信息共享是提升工作效率、降低成本的关键。本文将向您介绍一款基于Java技术构建的工程项目管理系统,该系统采用前后端分离的先进技术框架,功能全面,能够满足不同角色的需求,从项…

中英文语音合成芯片(TTS芯片)WT3000T8-在ETC上的应用案例

一:开发背景: 随着智能化浪潮的推进,ETC(电子不停车收费)系统已逐渐成为现代交通的重要组成部分。在这一背景下,唯创知音自主研发的WT3000T8中文转语音合成芯片(TTS芯片)以其卓越的性…

基于TAE的数字钥匙自动化测试解决方案

方案概述 在汽车发展和用户需求的推动下,汽车钥匙开始从传统的机械钥匙向数字化、智能化方向发展。目前常见的数字钥匙集成了蓝牙、NFC、UWB等技术实现了移动设备与车端的通信,可以帮助用户便捷的实现车辆功能控制。随着数字钥匙的广泛应用,相…

振弦式位移计在各类工程中的应用

振弦式位移计,作为一种高精度、高可靠性的测量工具,在各类工程中发挥着至关重要的作用。它通过测量弦的振动频率来间接得出结构的位移变化,为工程师和科学家们提供了精确的数据支持,从而确保工程的安全性和稳定性。 点击输入图片描…

YOLOv5改进 | 注意力机制 | 添加双重注意力机制 DoubleAttention【附代码/涨点能手】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在图像识别中,学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系,但这种形式效率极低。因此&…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作,是一个基于Apache Hadoop的库,为数据湖提供了一种有效的方法来处理更新和增量数据,并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

Linux源码编译安装MySQL + Qt连接MySQL

一、准备工作 1. 编译环境: 银河麒麟V10 飞腾D2000 CPU 2. 下载MySQL源码 这里编译的是5.7.44版本,带Boost库,这是官网的下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 3. 解压压缩包 tar -zxvf mys…