设计模式之命令模式(上)

命令模式
1)概述
1.定义

命令模式(Command Pattern) 将一个请求封装为一个对象,可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

2.作用

命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

3.结构图

通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法。

在这里插入图片描述

4.角色

Command(抽象命令类):抽象命令类一般是抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。

ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中,在实现execute()方法时,将调用接收者对象的相关操作(Action)。

Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求,一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系,在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。

Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

5.核心

命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。

命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。

6.代码实现

抽象命令类

abstract class Command {
	public abstract void execute();
}

具体命令类

public class ConcreteCommand extends Command {
  //维持一个对请求接收者对象的引用
	private Receiver receiver; 
 
	public void execute() {
	  //调用请求接收者的业务处理方法action()
		receiver.action(); 
	}
}

请求发送者

public class Invoker {
	private Command command;
	
    //构造注入
	public Invoker(Command command) {
		this.command = command;
	}
	
    //设值注入
	public void setCommand(Command command) {
		this.command = command;
	}
	
	//业务方法,用于调用命令类的execute()方法
	public void call() {
		command.execute();
	}
}

请求接收者

public class Receiver {
	public void action() {
		//具体操作
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis教程——数据类型(字符串、列表)

上篇文章我们学习了Redis教程——Redis入门,这篇文章我们学习Redis教程——数据类型(字符串、列表)。 Redis数据类型有:字符串、列表、哈希表、集合、有序集合、地理空间、基数统计、位图、位域和流。 字符串String 字符串类型…

UML 绘制工具 starUML 入门介绍

拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…

CPU+GPU+NPU三位一体AI边缘控制器,三屏异显,搭载RK3588处理器

XMS-201采用了Rockchip RK3588八核64位处理器,集成ARM Mali-G610 MP4四核GPU,内置AI加速器NPU,可提供6Tops算力,支持主流的深度学习框架;性能强劲的RK3588可为各类AI应用场景带来更强大的性能表现,适用于机…

Agent相关概念(更新中)

文章目录 Agent是什么Agent中要求LLM需要具备哪些能力Function Call(工具调用)Plan(规划)memory推理(总结)能力 Agent的实现方式PlanAndExecuteReact Agent是什么 在LLM语境下,Agent可以理解为…

八股面试——数据库——索引

索引的概念 B树的概念: 索引的作用 聚簇索引与非聚簇索引 聚簇索引就是主键值,在B树上,通过主键大小(数据在B树叶子节点按主键顺序排序)寻找对应的叶子节点,叶子节点保存的一整条记录。 非聚簇索引&#x…

bugku-misc 啊哒

拿到题目得到一张图片 尝试查看属性看到照相机型号 应该是加密字符,用010打开图片查看源码 文件结尾看到50 4B,是压缩包形式并且看到flag.txt 猜测是文件包含 kali用foremost尝试分离图片 得到zip文件,打开显示需要密码 想到一开始图片属…

MXNet的下载安装及问题处理

1、MXNet介绍: MXNet是一个开源的深度学习框架,以其灵活性和效率著称,支持多种编程接口,包括Python、C、R、Julia、Scala等。MXNet支持大规模分布式训练,同时兼顾CPU和GPU的计算资源,尤其擅长于模型并行和数…

android webview测试

启动手机自带的浏览器: from time import sleepfrom appium import webdriverclass TestBrowser:def setup_method(self):desire_caps {"platformName": "android","platformVersion": "12","deviceName": &qu…

90天玩转Python—06—基础知识篇:Python中的七大基础数据类

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

前端开发之Element树结构组件el-input的type=“password“时候账号密码自动填充解决方案

Element树结构组件el-input的type“password“时候账号密码自动填充解决方案 前言效果图解决方案 前言 在使用element的input的password当参数和login的参数相同时,在浏览器保存的用户名密码会自动填充,导致input附加上默认值 使用场景一般是在用户管理…

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。 输入格式 第…

阿里云ICP备案工信部短信核验详细流程,1分钟搞定教程!

网站ICP备案或APP备案通过云厂商的备案初审后,需要在工信部完成短信核验操作,本文云服务器吧yunfuwuqiba.com以阿里云备案为例,来详细说明工信部短信核验详细流程,非常简单: 阿里云备案提交到阿里云初审,初…

Vector - CAPL - XCP介绍_01

XCP协议全称为X Calibration Protocol,它是一种广泛使用在标定校准和测量的一种通信协议,由 ASAM 工作组标准化, 可以在不同的总线系统上使用,例如:XCP on CAN、XCP on CAN FD、XCP on Ethernet、XCP on FlexRay、XCP …

基于HIL+RCP的三相整流电路实验

今天给大家分享的是利用easygo netbox的模型文件,仿真三相整流的电路实验。 首先,打开Desksim软件,载入这个模型文件。然后切换到User Interface界面,自定义模型的监控界面。 我们拖入chart,就可以选择观测模型的三相电…

全面探究 LangChain Text Splitters

全面探究 LangChain Text Splitters 0. 引言1. 文本拆分器的类型2. 探究各个文本拆分器2-1. Split by HTML header2-2. Split by HTML section2-3. Split by character2-4. Split code2-5. MarkdownHeaderTextSplitter2-6. Recursively split JSON2-7. Recursively split by ch…

JS-25-浏览器和浏览器对象

一、浏览器 由于JavaScript的出现就是为了能在浏览器中运行,所以,浏览器自然是JavaScript开发者必须要关注的。 目前主流的浏览器分这么几种: IE 6~11:国内用得最多的IE浏览器,历来对W3C标准支持差。从IE10开始支持E…

MQ简介和面试题

一,什么是MQ MQ全称是Mwessage Queue(消息队列),是在消息传输过程中保存消息的容器,多用于分布式系统之间进行通信,解耦和低耦合性 二,常见的MQ产品 RebbitMQ,RocketMQ, ActiveMQ, Kafka, ZeroMQ, MetaMQ 其中我们…

【stm32】SPI通信简介

SPI通信 SPI简介部分 所有SPI设备的SCK、MOSI、MISO分别连在一起 从主机引出多根SS选择线,分别接到每个从机的SS输入端,主机的SS线都是输出,从机的SS线都是输入,SS线 是低电平有效,同一时间主机只能选择一个从机 只能…

【C++11】右值引用 + 移动语义 + 完美转发(重点)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

软考高级架构师:嵌入式系统的内核架构

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…