设计模式——职责链(责任链)模式
目录
职责链模式
小俱求实习
结构图
实例
职责链模式优点
职责链模式缺点
使用场景
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的过滤器和拦截器 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成…...
功耗相关总结
文章目录 功耗相关的使用场景MCU中低功耗的应用RTOS中低功耗应用 功耗相关的使用场景 目前越来越多的嵌入式设备采用电池进行供电,而不是跟台式电脑一样,可以一直连接着电源。在电池供电的场景下,对功耗的要求很高,工程师们尽量希…...
17款奔驰GLS450升级头等舱行政独立四座马鞍是什么样体验
五座版本:迈巴赫GLS480的五座版本通常指的是具有五个座位的配置,包括两个前排座椅和三个后排座椅。这种配置适合搭载更多乘客,后排座椅通常为三人座设计,乘坐人数较多。 四座版本:迈巴赫GLS480的四座版本通常指的是具…...
浏览器的下载行为基本原理
浏览器解析 在使用浏览器访问某些资源时,有些资源是直接下载有些资源是直接打开。例如前端的html,xml,css,图片等资源都是直接打开,而txt,excel等文件是直接下载。那么如何控制访问一个资源时是下载文件还…...
浅谈微服务的自动化部署
一、常用部署工具 jenkins,docker生态是比较常用的工具,本文也主要是聊这几个。其他如Kubernetes (K8s),Ansible,GitLab CI/CD等工具本文只是暂时提一下,不展开讨论。 二、比较jenkins和docker生态 1、jenkins 优点 jenkins功…...
【C语言】8.C语言操作符详解(1)
文章目录 1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5.位操作符:&、|、^、~5.1 &:按位与5.2 |:按位或5.3 ^:按位异或5.4 ~:按位取反5.5 例题例题1例题2例…...
Buzz库网络爬虫实例:快速爬取百度搜索实时热点
前言 随着互联网的发展,信息获取已经成为了人们日常生活和工作中的重要一环。而在信息获取的过程中,网络爬虫作为一种自动化的数据采集工具,为我们提供了极大的便利。本文将介绍如何利用PHP编写一个简单而高效的网络爬虫,实现快速…...
SQL注入:pikachu靶场中的SQL注入通关
目录 1、数字型注入(post) 2、字符型注入(get) 3、搜索型注入 4、XX型注入 5、"insert/update"注入 Insert: update: 6、"delete"注入 7、"http header"注入 8、盲…...
springsecurity入门登录授权
①我们需要自定义登陆接口,也就是在controller目录新建LoginController类,在controller方法里面去调用service接口,在service接口实现AuthenticationManager去进行用户的认证,注意,我们定义的controller方法要让Spring…...
医学科技查新中对查新点的撰写方法!附案例讲解!
我国的科技查新工作最早是从医学领域开始的,始于1985年中国科学院医学情报所,后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分,其中医学立项查新,它是指在医学科研项目申报开题之前,…...
2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版
2024最新流媒体在线音乐系统网站源码| 音乐社区 | 多语言 | 开心版 https://download.csdn.net/download/huayula/89347742...
回溯算法05(leetcode491/46/47)
参考资料: https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 491. 非递减子序列 题目描述: 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素…...
Transformer,革命性的深度学习架构
Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神经网络(RNN)和卷积神经网络(CNN)的序列建模常规,…...
实验五:实现循环双链表各种基本运算的算法
实验五:实现循环双链表各种基本运算的算法 一、实验目的与要求 目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。 内容:编写一个程序cdinklist.cpp,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为char),并…...
ElasticSearch IK分词器的安装、词典扩展与停用
🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:云原生与服务部署-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…...
代码随想录训练营总结
为期两个月的代码随想录训练营今天结束了,我想我的收获是非常大的。进到训练营的大群里,令我有种安心的感觉,原来世界各地有这么多与我一起努力的伙伴。更令人安心的是知识星球对于学习进度的规划,细化到每一天每道题,…...
深度学习-转置卷积
转置卷积 转置卷积(Transposed Convolution),也被称为反卷积(Deconvolution),是深度学习中的一种操作,特别是在卷积神经网络(CNN)中。它可以将一个低维度的特征图&#x…...
Unity性能优化工具介绍
文章目录 一.Stats组件1.Audio音频的数据组件:2.图形数据 二.Profiler 性能分析器 一.Stats组件 Unity自带Statistics(统计数据),Game视窗中点击Stats打开 1.Audio音频的数据组件: 1):Level 声音强度 单位是分贝(dB) 表示音频听声音的大小,是闪烁波动的. 2):SDPload 数据信…...
Math之向上向下取整
有时我们会遇到向上和向下取整的操作,这时我们可以使用Math类来进行操作。 1、向上取整 Math.ceil() 方法返回大于或等于指定表达式的最小整数(即向上取整)。如果参数是一个整数,那么结果就是这个整数本身。 示例: …...
MPP架构
MPP架构,即Massively Parallel Processing(大规模并行处理)架构,是一种用于处理大规模数据的并行计算架构。它通过将数据和计算能力分布在多个处理节点上,利用并行处理技术来加速数据处理和分析的速度。 在MPP架构中&…...
UE4.62生成sln时失败:Missing .../DotNET/UnrealBuildTool/UnrealBuildTool/UnrealBuildTool.exe
问题1: vs编译报错,以为是热加载,把项目的几个文件删了,想右键点击Generate Visual Studio Project Files重构,报错。 解决方法:: 是看m0_62179790这个博主解决的。 只要把下面这行东西添加到你自己的UE…...
Python农业物联网部署突然中断?揭秘土壤传感器数据丢包率超37%的底层时钟漂移根源(附校准代码)
第一章:Python农业物联网部署在现代农业数字化转型中,Python凭借其丰富的物联网生态库(如paho-mqtt、Adafruit-IO、RPi.GPIO)和轻量级运行特性,成为边缘设备与云平台协同的核心语言。本章聚焦于基于树莓派的土壤温湿度…...
ROS2 Jazzy尝鲜指南:在Ubuntu 24.04上从安装到跑通第一个Demo(附常见错误修复)
ROS2 Jazzy尝鲜指南:在Ubuntu 24.04上从安装到跑通第一个Demo Ubuntu 24.04 LTS的发布带来了全新的ROS2 Jazzy版本,这对机器人开发者来说无疑是一次令人兴奋的技术升级。作为长期支持版本,Jazzy将在未来五年内获得官方维护,这意味…...
如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案
如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案 【免费下载链接】ChatALL Concurrently chat with ChatGPT, Bing Chat, Bard, Alpaca, Vicuna, Claude, ChatGLM, MOSS, 讯飞星火, 文心一言 and more, discover the best answers 项目地…...
计算机毕业设计springboot基于的游戏交易平台 基于SpringBoot的虚拟资产流通服务平台的设计与实现 基于SpringBoot架构的网络游戏账号及道具交易系统的设计与实现
计算机毕业设计springboot基于的游戏交易平台(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展和网络游戏产业的蓬勃兴起,虚拟资产交易已成为…...
CasRel开源大模型部署教程:一键拉取镜像+5分钟完成SPO推理
CasRel开源大模型部署教程:一键拉取镜像5分钟完成SPO推理 1. 什么是CasRel关系抽取模型 如果你需要从大段文字中自动找出"谁做了什么"、"谁是什么"这样的信息,CasRel模型就是你的得力助手。这个模型专门用来从文本中提取主体-谓语…...
Venera:5大革新功能打造无缝全平台漫画阅读体验
Venera:5大革新功能打造无缝全平台漫画阅读体验 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera Venera 是一款开源跨平台漫画应用,专为漫画爱好者打造全设备同步的阅读解决方案。无论你使用 Windows、…...
永磁同步电机双矢量模型预测电流MPCC控制仿真:传统与现代控制策略的对比分析
永磁同步电机双矢量模型预测电流MPCC控制仿真【参考文献】 (1)参考文献:《永磁同步电机鲁棒双矢量模型预测电流控制_郭鑫》 (2)描述:传统单矢量预测电流控制在单个控制周期内只能输出单个电压矢量ÿ…...
Joy-Con Toolkit:让Switch玩家掌控设备的开源管理方案
Joy-Con Toolkit:让Switch玩家掌控设备的开源管理方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 为什么Switch玩家需要专属管理工具? 当你插入Switch游戏卡带时,是否担心…...
告别风扇噪音与过热:FanControl智能控温完全指南
告别风扇噪音与过热:FanControl智能控温完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…...
