设计模式 -- 责任链模式(Chain of Responsibility Pattern)
责任链模式:和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
介绍
- 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
- 主要解决问题:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,总的来说就是职责链将请求的发送者和请求的处理者解耦。
- 关键代码:抽象类里面聚合它自己(聚合和抽象类我在设计模式的六大原则-CSDN博客有介绍和示例),在里面判断是否满足条件,如果没达到条件则向下传递。
- 优点:1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
- 缺点:1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。
还这个绘制三角形、圆形、矩形图案例子
- 创建抽象的绘制类。
public abstract class AbstractDraw {public static String TRIANGLE = "三角形";public static String CIRCULAR = "圆形";public static String RECTANGLE = "矩形";protected String shape;//责任链中的下一个接收者protected AbstractDraw nextDraw;public void setNextDraw(AbstractDraw nextDraw){this.nextDraw = nextDraw;}public void draw(String shape, String colour){if(this.shape.equals(shape)){drawing(colour);}if(nextDraw !=null){nextDraw.draw(shape, colour);}}abstract protected void drawing(String colour);} - 创建扩展该绘制类的
三角形责任实体类public class TriangleDraw extends AbstractDraw{public TriangleDraw(String shape) {this.shape = shape;}@Overrideprotected void drawing(String colour) {//绘制一个colour颜色的三角形逻辑} }圆形责任实体类public class CircularDraw extends AbstractDraw{public CircularDraw(String shape) {this.shape = shape;}@Overrideprotected void drawing(String colour) {//绘制一个colour颜色的圆形逻辑} }矩形责任实体类public class RectangleDraw extends AbstractDraw{public RectangleDraw(String shape) {this.shape = shape;}@Overrideprotected void drawing(String colour) {//绘制一个colour颜色的距形逻辑} } - 创建不同类型的责任编排成链
public class ChainPatternDemo {//编排成链static AbstractDraw getChainOfDraw(){AbstractDraw triangleDraw = new TriangleDraw(AbstractDraw.TRIANGLE);AbstractDraw circularDraw = new CircularDraw(AbstractDraw.CIRCULAR);AbstractDraw rectangleDraw = new RectangleDraw(AbstractDraw.RECTANGLE);triangleDraw.setNextDraw(circularDraw);circularDraw.setNextDraw(rectangleDraw);return triangleDraw;}//使用示例public static void main(String[] args) {AbstractDraw drawChain = getChainOfDraw();drawChain.draw(AbstractDraw.TRIANGLE,"红色");drawChain.draw(AbstractDraw.CIRCULAR,"蓝色");drawChain.draw(AbstractDraw.RECTANGLE,"绿色");} }
相关文章:
设计模式 -- 责任链模式(Chain of Responsibility Pattern)
责任链模式:和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它…...
开源:特殊的垄断
免责声明:本博客旨在分享我对开源策略的理解和体会,不代表任何组织或机构的立场或观点,也不构成任何商业或投资的建议或担保。本博客的内容可能存在错误或遗漏,也可能随着时间的推移而变得过时或不适用。请在使用或依赖本博客的内…...
linux安装oracle client解决cx_Oracle.DatabaseError: DPI-1047
背景: 需要在linux上调用python,连接oracle数据,在执行脚本是出现如下错误: 由于未安装client,所有找不到对应的文件 [root@xx wxArticle]# python main.py Traceback (most recent call last):File "main.py", line 16, in <module>oracle_db = cx_Or…...
工业园区一般用多大规格的电表?
随着我国经济的快速发展,工业园区在各地区如雨后春笋般崛起。作为电力系统的重要组成部分,电表的选择与应用对于工业园区的稳定运行至关重要。那么,工业园区一般用的是多大规格的电表呢?下面,小编就来给大家揭秘一下&a…...
Debian12换镜像源
0 背景 用docker运行了一个node容器,发现连vim也没有,所以打算安一个vim 1 查看操作系统 find / -name *release* #查看release信息2 更换镜像源 2.1 从网上找个国内镜像源 确定好操作系统版本后,从网上搜一下对应的数据源。这里提供一个…...
deeplog中输出某个 event 的概率
1 实现之后效果 # import DeepLog and Preprocessor import numpy as np from deeplog import DeepLog import torch# Create DeepLog object deeplog DeepLog(input_size 10, # Number of different events to expecthidden_size 64 , # Hidden dimension, we suggest 64…...
流媒体中relay和forword的区别
在流媒体中,"relay"(中继)和 "forward"(转发)是两种常见的传输方式,用于将流媒体从一个源传递到目标接收器。它们的区别如下: Relay(中继)ÿ…...
git创建本地分支并提交到远程
创建本地分支 git branch local_branch_name切换到本地分支 git checkout local_branch_name提交代码 git add . git commit -m "commit_message"添加远程信息 git remote add origin remote_git_address提交到远程 git push origin local_branch_name:remote_b…...
Selenium定位元素的方法css和xpath的区别
selenium是一种自动化测试工具,它可以通过不同的定位方式来识别网页上的元素,如id、name、class、tag、link text、partial link text、css和xpath。 如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以加裙485187702&#x…...
【目标检测】SSD损失函数详解
文章目录 定位损失 L l o c L_{loc} Lloc偏移值的计算smooth L1 loss 置信率损失 L c o n f L_{conf} Lconf 最近看看这个古早的目标检测网络,看了好多文章,感觉对损失函数的部分讲得都是不很清楚得样子,所以自己捋一下。 首先&#x…...
C【整数正序分解】
// 整数正序分解 #include <stdio.h> #include <stdlib.h>int main() {int x;scanf("%d", &x);// 13425/10000->1(int一个d)// 13425%10000->3425(这是x)// 10000/10-.1000(这是mask)int mask 1;int t x;while (t > 9){t / 10;mask * 10;…...
基于springboot实现高校党务平台管理系统【项目源码】计算机毕业设计
基于springboot实现高校党务平台管理系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群&#x…...
Day24力扣打卡
打卡记录 寻找峰值(二分法) class Solution { public:int findPeakElement(vector<int> &nums) {int left -1, right nums.size() - 1; // 开区间 (-1, n-1)while (left 1 < right) { // 开区间不为空int mid left (right - left) / …...
5G-A 商用加速,赋能工业互联网
2019 年 6 月,中国工业和信息化部发放 5G 商用牌照。同年 10 月,三大运营商公布 5G 商用套餐,11 月 1 日正式上线 5G 商用套餐,标志中国正式进入 5G 商用新纪元。今年是 5G 商用的第五年,在当前数字经济蓬勃发展的催化…...
代码随想录day2
目录 vscode 自定义代码模板Reference vscode 自定义代码模板 select User snippets from Settings on the bottom left corner. select a certain language for example: cpp create your own snippets 格式如下,防着写 第一行"cpp template",模板…...
UML/SysML建模工具更新(2023.10)(1)StarUML、Software Ideas Modeler
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 工具最新版本:Software Ideas Modeler 14.02 更新时间:2023年10月9日 工具简介 轻量级建模工具,支持UML、BPMN、SysML。 平台:Windo…...
kubectl 资源管理命令-陈述式
目录 一、kubectl陈述式资源管理: 二、kubectl陈述式对象管理: 1.基础命令使用: 1.1 帮助手册: 1.2 查看版本信息: 编辑 1.3 查看资源对象简写: 1.4 查看集群信息: 1.5 配置kubectl自动补全: 1.6 node节点查看日志…...
【紫光同创国产FPGA教程】——【PGL22G第九章】HDMI环路实验例程
本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL22G开发平台(盘古22K) 一:盘古22K开发板(紫光同创PGL22G开…...
IDEA Plugin插件开发相关踩坑
1 前言 最近在研究IDEA插件开发,踩了不少坑,特意在这里记录一下…… 2 Java相关类找不到 照着网上一些资料,想要实现代码审计自动提示功能,需要继承AbstractBaseJavaLocalInspectionTool 结果import一片爆红,找不到相…...
汽车标定技术(八)--MPC57xx是如何支持标定的页切换
目录 1.页切换的概念 1.1 标定常量的理解 1.2 页切换 2.MPC57xx的Overlay模块 3.小结 1.页切换的概念 在汽车标定测量中,有一个概念我想很多人都听过,但是实际上在项目里没有用到过,那就是今天要讲的页切换概念。在讲页切换的时候&#…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
