设计模式 -- 责任链模式(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.页切换的概念 在汽车标定测量中,有一个概念我想很多人都听过,但是实际上在项目里没有用到过,那就是今天要讲的页切换概念。在讲页切换的时候&#…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...