当前位置: 首页 > news >正文

设计模式——职责链(责任链)模式

目录

职责链模式

小俱求实习

结构图

实例

职责链模式优点

职责链模式缺点

使用场景

1.springmvc流程

​2.mybatis的执行流程

3.spring的过滤器和拦截器


职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

 一个请求有多个对象可以处理,但每个对象的处理条件或权限不同,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

概念可能不容易理解,我先举一个例子说说亲身体会的一件事,就叫小俱求实习吧。

小俱求实习

背景:2024上半年  小俱正值大三下学期

在这个92✌到处出没的社会市场下,双非一本的小俱心感没有任何优势,苦苦找实习,实习要求虽说没有秋招正式高,在苦苦投递十几大厂下,做测评、做笔试.....不知今年大厂对双非学历究竟如何评估,终于小俱迎来了美团、腾讯云智、游族的面试......每次面试后,小俱深知自己哪块还没有学到位,甚至有的问题没有听过,小俱最终进入人才池。双非就真的菜吧......小俱仍不甘心,继续沉淀......

最终小俱通过boss投递小厂,甘心为公司做牛做马,同时马不停蹄的巩固知识,通过二面,收到了北京一家实习offer,接着有重庆、成都。

小俱满怀期待,兴致勃勃去给辅导员请假!(划重点!)

在辅导员要求提交几种资料后

辅导员回复:我这里只能批准3天假期,你出去实习这件事必须和领导商量。

好,小俱等待批假......

过了一天,辅导员说:领导说他只能批7天假,有的课程还没有完,你这每周需要回来一次,经过我们的开会,批准不同意。

啊!小俱说那我每周请假,每周回来,辅导员仍不同意!

小俱苦苦说机会来之不易,希望领导理解通融!

辅导员其实仅仅传达了领导的命令,理智的小俱不麻烦年轻的辅导员,直接自己找领导。

于是小俱亲自找到领导: 

领导:我这个只能批7天的假,根据目前的教学管理,不允许实习,再说,你实习地点离学校远,每次请7天假也不现实,你这个就属于请长假,你需要找大领导,他同意就行!

小俱人不罢休,去找大领导!

大领导:根据目前的教学管理规定,大三不允许实习............(此处省略各种理由,态度好,很委婉),我们非常支持你们实习,你们有这种意识也非常好,我很支持!(.....好,说了很多,就是不给假。。。)

最终小俱实习失败。

小俱一级一级的找领导,最终失败,但小俱调整心态,继续沉淀。

现在大概理解了职责链模式了吧!

结构图

实例

结构图,举例请假、加薪场景

管理者抽象类  Manager 

//管理者抽象类
abstract class Manager {protected String name;public Manager(String name) {this.name = name;}//设置管理者上级protected Manager superior;public void setSuperior(Manager superior){this.superior = superior;}//请求申请public abstract void requsetApplications(Request request);}

 申请Request类

//申请
class Request{//申请类别private String requestType;//申请内容private String requestContent;//数量private int number;public void setRequestType(String requestType) {this.requestType = requestType;}public void setRequestContent(String requestContent) {this.requestContent = requestContent;}public void setNumber(int number) {this.number = number;}public String getRequestType() {return requestType;}public String getRequestContent() {return requestContent;}public int getNumber() {return number;}
}

普通经理 CommonManager 

//普通经理
class  CommonManager extends Manager{public CommonManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"&& request.getNumber()<=2){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+ request.getNumber()+"天,批准");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

 总监Director 

//总监
class  Director extends Manager{public Director(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"&&request.getNumber()<=5){System.out.println(this.name+":"+request.getRequestContent()+"数量:" + request.getNumber()+"天,批准");}else {if (this.superior!=null){this.superior.requsetApplications(request);}}}
}

总经理GeneralManager  

//总经理  都会处理
class GeneralManager extends Manager{public GeneralManager(String name) {super(name);}@Overridepublic void requsetApplications(Request request) {if (request.getRequestType()=="请假"){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,批准");}else if (request.getRequestType()=="加薪"&&request.getNumber()<=5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,批准");}else if (request.getRequestType()=="加薪"&&request.getNumber()>5000){System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,再说吧");}}
}

 客户端:

class Test{public static void main(String[] args) {CommonManager manager = new CommonManager("经理");Director director = new Director("总监");GeneralManager generalManager = new GeneralManager("总经理");//设置每个级别的上级manager.setSuperior(director);director.setSuperior(generalManager);Request request = new Request();request.setRequestType("请假");request.setRequestContent("小菜请假");request.setNumber(1);manager.requsetApplications(request);Request request2 = new Request();request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(4);manager.requsetApplications(request2);Request request3 = new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜加薪");request3.setNumber(1000);manager.requsetApplications(request3);Request request4 = new Request();request4.setRequestType("加薪");request4.setRequestContent("小菜加薪");request4.setNumber(6000);manager.requsetApplications(request4);}
}

 运行结果

职责链模式优点

「降低了对象之间的耦合度」

责任链模式让发送者不需要知道对方的具体是哪个处理者处理请求。

「增强了系统的可扩展性」

可以根据需要增加新的请求处理类,满足开闭原则。

「增强了给对象指派职责的灵活性」

当工作流程发生变化,客户端可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

「责任链简化了对象之间的连接」

每个对象只需保持一个指向其后继者的引用。

「责任分担」

每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成。

职责链模式缺点

  • 不能保证每个请求一定被处理。由于一个「请求没有明确的接收者」,该请求可能一直传到链的末端都得不到处理。
  • 当责任链比较长的时候,请求的处理可能涉及多个处理对象,系统性能受影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会造成循环调用。

使用场景

1.springmvc流程

就拿这个springMvc的执行流程来说,全部流程就组成了一个链条。每一个步骤就是一个结点,每个结点都会有对应的处理方法,每个结点处理完成之后,就会进入下一个结点。一旦某个结点出现异常,那么当前的链路就会停止,当前请求中断。

2.mybatis的执行流程

mybatis的执行流程也是通过这个责任链模式,如首先会创建这个SqlSessionFactory,然后通过这个工厂创建一个SqlSession,这个SqlSession只是一个门面模式,会通过Executer执行增删改查的操作,然后一个Handler用于设置参数,一个Handler用于返回结果集,最后通过这个StatementHandler将执行结果获取。里面的整个步骤就相当于形成了一个链条,执行完当前结点就会进入下一个结点,如果出现异常,链条终止往下执行。

3.spring的过滤器和拦截器

spring里面的这个过滤器链路的调用,以及拦截器的链路调用,也是采用这种责任链模式

 

 

参考文章:http://t.csdnimg.cn/rkTNL

 

相关文章:

设计模式——职责链(责任链)模式

目录 职责链模式 小俱求实习 结构图 实例 职责链模式优点 职责链模式缺点 使用场景 1.springmvc流程 ​2.mybatis的执行流程 3.spring的过滤器和拦截器 职责链模式 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成…...

功耗相关总结

文章目录 功耗相关的使用场景MCU中低功耗的应用RTOS中低功耗应用 功耗相关的使用场景 目前越来越多的嵌入式设备采用电池进行供电&#xff0c;而不是跟台式电脑一样&#xff0c;可以一直连接着电源。在电池供电的场景下&#xff0c;对功耗的要求很高&#xff0c;工程师们尽量希…...

17款奔驰GLS450升级头等舱行政独立四座马鞍是什么样体验

五座版本&#xff1a;迈巴赫GLS480的五座版本通常指的是具有五个座位的配置&#xff0c;包括两个前排座椅和三个后排座椅。这种配置适合搭载更多乘客&#xff0c;后排座椅通常为三人座设计&#xff0c;乘坐人数较多。 四座版本&#xff1a;迈巴赫GLS480的四座版本通常指的是具…...

浏览器的下载行为基本原理

浏览器解析 在使用浏览器访问某些资源时&#xff0c;有些资源是直接下载有些资源是直接打开。例如前端的html&#xff0c;xml&#xff0c;css&#xff0c;图片等资源都是直接打开&#xff0c;而txt&#xff0c;excel等文件是直接下载。那么如何控制访问一个资源时是下载文件还…...

浅谈微服务的自动化部署

一、常用部署工具 jenkins,docker生态是比较常用的工具&#xff0c;本文也主要是聊这几个。其他如Kubernetes (K8s)&#xff0c;Ansible&#xff0c;GitLab CI/CD等工具本文只是暂时提一下&#xff0c;不展开讨论。 二、比较jenkins和docker生态 1、jenkins 优点 jenkins功…...

【C语言】8.C语言操作符详解(1)

文章目录 1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符&#xff1a;&、|、^、~5.1 &&#xff1a;按位与5.2 |&#xff1a;按位或5.3 ^&#xff1a;按位异或5.4 ~&#xff1a;按位取反5.5 例题例题1例题2例…...

Buzz库网络爬虫实例:快速爬取百度搜索实时热点

前言 随着互联网的发展&#xff0c;信息获取已经成为了人们日常生活和工作中的重要一环。而在信息获取的过程中&#xff0c;网络爬虫作为一种自动化的数据采集工具&#xff0c;为我们提供了极大的便利。本文将介绍如何利用PHP编写一个简单而高效的网络爬虫&#xff0c;实现快速…...

SQL注入:pikachu靶场中的SQL注入通关

目录 1、数字型注入&#xff08;post&#xff09; 2、字符型注入&#xff08;get&#xff09; 3、搜索型注入 4、XX型注入 5、"insert/update"注入 Insert&#xff1a; update&#xff1a; 6、"delete"注入 7、"http header"注入 8、盲…...

springsecurity入门登录授权

①我们需要自定义登陆接口&#xff0c;也就是在controller目录新建LoginController类&#xff0c;在controller方法里面去调用service接口&#xff0c;在service接口实现AuthenticationManager去进行用户的认证&#xff0c;注意&#xff0c;我们定义的controller方法要让Spring…...

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的&#xff0c;始于1985年中国科学院医学情报所&#xff0c;后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分&#xff0c;其中医学立项查新&#xff0c;它是指在医学科研项目申报开题之前&#xff0c…...

2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版

2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版 https://download.csdn.net/download/huayula/89347742...

回溯算法05(leetcode491/46/47)

参考资料&#xff1a; https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 491. 非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素…...

Transformer,革命性的深度学习架构

Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神经网络(RNN)和卷积神经网络(CNN)的序列建模常规,…...

实验五:实现循环双链表各种基本运算的算法

实验五&#xff1a;实现循环双链表各种基本运算的算法 一、实验目的与要求 目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。 内容:编写一个程序cdinklist.cpp,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为char),并…...

ElasticSearch IK分词器的安装、词典扩展与停用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…...

代码随想录训练营总结

为期两个月的代码随想录训练营今天结束了&#xff0c;我想我的收获是非常大的。进到训练营的大群里&#xff0c;令我有种安心的感觉&#xff0c;原来世界各地有这么多与我一起努力的伙伴。更令人安心的是知识星球对于学习进度的规划&#xff0c;细化到每一天每道题&#xff0c;…...

深度学习-转置卷积

转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也被称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是深度学习中的一种操作&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中。它可以将一个低维度的特征图&#x…...

Unity性能优化工具介绍

文章目录 一.Stats组件1.Audio音频的数据组件:2.图形数据 二.Profiler 性能分析器 一.Stats组件 Unity自带Statistics(统计数据),Game视窗中点击Stats打开 1.Audio音频的数据组件: 1):Level 声音强度 单位是分贝(dB) 表示音频听声音的大小,是闪烁波动的. 2):SDPload 数据信…...

Math之向上向下取整

有时我们会遇到向上和向下取整的操作&#xff0c;这时我们可以使用Math类来进行操作。 1、向上取整 Math.ceil() 方法返回大于或等于指定表达式的最小整数&#xff08;即向上取整&#xff09;。如果参数是一个整数&#xff0c;那么结果就是这个整数本身。 示例&#xff1a; …...

MPP架构

MPP架构&#xff0c;即Massively Parallel Processing&#xff08;大规模并行处理&#xff09;架构&#xff0c;是一种用于处理大规模数据的并行计算架构。它通过将数据和计算能力分布在多个处理节点上&#xff0c;利用并行处理技术来加速数据处理和分析的速度。 在MPP架构中&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...