首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >看完面试稳一半!说说责任链模式的实现原理

看完面试稳一半!说说责任链模式的实现原理

作者头像
Tom弹架构
发布于 2023-09-18 09:08:34
发布于 2023-09-18 09:08:34
3890
举报
文章被收录于专栏:Tom弹架构Tom弹架构

HashMap主要是用来处理键值对数据。随着JDK版本的更新,JDK1.8对HashMap对底层也做了一些优化。今天我带大家一起来结合源码,深入浅出HashMap工作原理。

责任链模式应用场景非常多、比如拦截器、过滤器等等。但是要彻底理解责任链的实现原理还是有一定难度的,因此,责任链模式的实现原理也就成为了一道互联网大厂的高频面试题。今天,我给小伙伴们来详细地掰一掰,保证让你彻底搞明白,不服来战。

01

责任链模式的定义

关于责任链模式的定义,官方原文是这样描述的:

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

翻译过来就是:

将链中每一个节点都看作一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从 的首端发出时,会沿着责任链预设的路径依次传递到每一个节点对象,直至被链中的某个对象处理为止。

简答一句话总结就是:将处理不同逻辑的对象连接成一个链表结构,每个对象都保存下一个节点的引用。

我们在平时处理工作中的时候,往往需要各部门协同合作来完成某一个任务。因为,每个部门都有各自的职责,所以,很多时候事情完成一半,就要会转交到下一个部门,甚至还要盖章,直到所有部门都审批通过,事情才能完成。这就相当于将皮球层层往上踢。

还记得小时候追过的一个电视剧,80后应该都看过,有位太极高手闯七层宝塔,每一层都住了一位武林高手,层层往上“过五关,斩六将”,打赢才能往上一层,打输了就踢回去,最后登顶。当时看得是热血沸腾,这也是责任链的一种场景。不过忘记电视剧叫什么名字了,小伙伴们可以评论区告诉我一下。

所以责任链模式又被戏称为“踢皮球”模式。那责任链模式的实现原理又是怎样的呢?

02

责任链模式的实现原理

责任链又分为单向责任链和双向责任链,单向责任链比较简单也容易理解,双向责任链相当于是一个执行闭环,较为复杂。

我们先来分析单向责任链。它的结构是这样设计的,首先,设计一个单向链表的上下文Context,保存链表的头(head )引用 和 尾(tail)引用,Context的代码结构是这样的。

然后,在上下文中加入Handler,也就是处理业务逻辑的节点类,每个Hnandler都保存了下一个执行节点的引用,形成一条完整的执行链路。Handler的通用代码结构是这样的。

J2EE中的Filter过滤器、Spring中的Interceptor拦截器都是采用这样的单向链表的设计。

那双向链表又如何设计呢?它和单向链表的基本结构一致,我们来看,它只是在Handler中增加了对上一个节点的引用。这样责任链就行了一个执行闭环,就好比是环线地铁。来看它的通用代码结构是这样的。

Netty中的Piepline管道就是采用这样的双向链表的设计。

责任链模式一般还会结合建造者模式来使用,实现链式编程。

03

责任链模式的优缺点

那这样设计又有什么优点和缺点呢?先给大家总结一下它的优点:

(1)实现了将请求与处理完全解耦。

(2)请求处理者只需关注自己职责范围内的请求进行处理即可,对于不是职责范围内的请求,直接转发给下一个节点对象。

(3)具备链式传递处理请求的功能,请求发送者不需要知晓链路结构,只需等待请求处理结果即可。

(4)链路结构灵活,可以通过改变链路结构动态地新增或删减责任。

那这样设计,会有哪些缺点呢?我也给大家总结一下:

(1)如果责任链路太长或者处理时间过长,会影响程序执行的整体性能。

(2)如果节点对象存在循环引用,有可能会造成死循环,从而导致程序崩溃。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-08 15:44,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
go语言下载及安装「建议收藏」
go env -w GOPROXY=https://goproxy.cn,direct 修改国内镜像
全栈程序员站长
2022/09/16
1.3K0
更新完IDEA后,如何永久使用?
今天一早用IDEA写代码,看到右下角有提示更新,有点强迫症的我,就手欠的又点了下更新,结果悲剧了,居然提示许可证过期,IDEA过期了,如下图所示:
软件测试君
2020/02/19
5.4K3
更新完IDEA后,如何永久使用?
IDEA激活教程
下载补丁文件 jetbrains-agent.jar 并将它放置到 idea安装目录的\bin目录下
程序员的时光001
2020/07/14
2K1
IDEA激活教程
Java接口自动化之IDEA介绍、永久激活及常用快捷键
在此之前的Python接口自动化系列,有些小伙伴没赶上,为了提升面试信心,展示技术的多样性,让面试官认可我们的技术(吹牛)能力,接下来就要开始Java接口自动化的旅程。
可可的测试小栈
2020/12/31
9440
Go安装与Goland破解永久版
1、建议去go语言中文网下载,网址:https://studygolang.com/dl ,下图是下载页面及包介绍
双面人
2021/01/14
31K1
Go安装与Goland破解永久版
Pycharm2022最新激活破解教程(永久激活)
Pycharm2022.2最新激活破解教程(永久激活)通过补丁可以永久激活IDEA,前面IDEA安装方式都是一样的,主要是后面的步骤,注意看后面就行~
灬沙师弟
2022/10/11
11.9K0
Goland 激活教程
1.修改hosts文件 将0.0.0.0 account.jetbrains.com和0.0.0.0 www.jetbrains.com添加到hosts文件最后,注意hosts文件无后缀,如果遇到无法修改或权限问题,可以采用覆盖的方法去替换hosts文件
李昂君
2021/12/24
1.6K1
golang、go mod环境变量配置、goland永久激活
首先你的下载golang的sdk,写文章的时候最下版本是1.13,网速可以的去官网下载,无法下载的,提供两个地址csdn下载 和 服务器下载。
用户2235302
2019/12/03
2.7K1
golang、go mod环境变量配置、goland永久激活
IntelliJ IDEA 开发工具安装和使用
1:在官网上下载IntelliJ IDEA 开发工具 https://www.jetbrains.com/idea/download/#section=windows
王小婷
2019/04/09
1.2K0
IntelliJ IDEA 开发工具安装和使用
PyCharm2019 激活方式
1.修改hosts文件 将0.0.0.0 account.jetbrains.com和0.0.0.0 www.jetbrains.com添加到hosts文件最后,注意hosts文件无后缀,如果遇到无法修改或权限问题,可以采用覆盖的方法去替换hosts文件 修改后请检查hosts文件是否修改,激活码无法激活的原因99.99%是因为hosts没有修改正确 Windows系统hosts文件路径为:c:\windows\system32\drivers\etc Ubantu(Linux)系统hosts文件路径为:/etc
py3study
2020/01/16
2K0
IDEA2022.3.2最新激活码
/W438N4X12J-eyJsaWNlbnNlSWQiOiJXNDM4TjRYMTJKIiwibGljZW5zZWVOYW1lIjoidHJlbmRzIHJhYmJpcyIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMi0wOCIsInBhaWRVcFRvIjoiMjAyMy0wMi0wOCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUERCIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMi0wOCIsInBhaWRVcFRvIjoiMjAyMy0wMi0wOCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQV1MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAyLTA4IiwicGFpZFVwVG8iOiIyMDIzLTAyLTA4IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDItMDgiLCJwYWlkVXBUbyI6IjIwMjMtMDItMDgiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFBTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMi0wOCIsInBhaWRVcFRvIjoiMjAyMy0wMi0wOCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUEMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAyLTA4IiwicGFpZFVwVG8iOiIyMDIzLTAyLTA4IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBSQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDItMDgiLCJwYWlkVXBUbyI6IjIwMjMtMDItMDgiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNXIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMi0wOCIsInBhaWRVcFRvIjoiMjAyMy0wMi0wOCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAyLTA4IiwicGFpZFVwVG8iOiIyMDIzLTAyLTA4IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBDV01QIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMi0wOCIsInBhaWRVcFRvIjoiMjAyMy0wMi0wOCIsImV4dGVuZGVkIjp0cnVlfV0sIm1ldGFkYXRhIjoiMDEyMDIyMDIwOFBTQU4wMDAwMDUiLCJoYXNoIjoiVFJJQUw6LTIwMDMxNDk5MzciLCJncmFjZVBlcmlvZERheXMiOjcsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-U0uteIUdI7Pn3l6b42jdvpWmT4iDDXJcC69WIw3EB4sX47Qt98McKvbzUHKsAftFyMRG7HhyG5aFCnQYqVKgOAgYuOZ+vhT4yGHOMHpWtJ/cJnKHmki+pv7jhEc7gfyyk0Gv+5dzdKUGlinX357XGrfe4WJjtRXb6txvgChdlG8wqqi8t9VO7+n5N8XxCStgAmB6eOGVY00ZzXvdP96RRU4YdbD4NM3Hu49ZOC9eR7NxZADSmkhg3F6NPBMKPyQ/QKhFEXaqcexoYcQdwUkLjqUxsvs8zglHp0toM5jcccfqJ2EVbRSsrk5j7qL/h1QvSQJepRzrn8qra9Ne62eaUw==-MIIETDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIwMTAxOTA5MDU1M1oXDTIyMTAyMTA5MDU1M1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDw
灬沙师弟
2023/02/26
6K1
IDEA2022.3.2最新激活码
IntelliJ IDEA 开发工具安装和使用
1:在官网上下载IntelliJ IDEA 开发工具 https://www.jetbrains.com/idea/download/#section=windows
王小婷
2025/05/18
1750
IntelliJ IDEA 开发工具安装和使用
intellij idea破解2019(2019年科目二考试全过程视频)
本来看网上已经有写的不错的教程,结果用起来的时候发现有一些问题,首先是版本号的问题,另外是文件路径问题,还有就是碰到的修改hosts没有权限问题,还是想着记录一下,方便需要的童鞋使用。
全栈程序员站长
2022/07/31
3160
intellij idea破解2019(2019年科目二考试全过程视频)
IDEA 2022.1 最新版本即将发布,功能强大,附带免费激活码...
IntelliJ-IDEA_2022.1-RC_blog_featured-2x.png
终码一生
2022/04/10
2.2K0
IDEA 2022.1 最新版本即将发布,功能强大,附带免费激活码...
亲自测试可用 idea 2018.1激活教程-凯哥亲自测试可用
自从上次,因为360的原因,凯哥卸载idea已经快一个月了。当时安装2018版本的没有激活,今天提示两天后到期,凯哥就找2018.1的激活码。亲自测试可用。并且凯哥现在用的就是这个。
凯哥Java
2020/07/04
1.7K0
亲自测试可用 idea 2018.1激活教程-凯哥亲自测试可用
Jetbrains 其他产品对应激活码
在运行脚本之后,需要填入对应 IDE 的激活码,每个 IDE 对应的激活码都不一样,本文罗列一些常用 IDE 的激活码
kenvie
2022/04/01
2.5K0
手把手教你破解Pycharm2018.2(JetBrains全家桶)
最近有小伙伴反映自己的Pycharm快过期了,问我有没有时间出一个破解的教程。正好今天有空,我就准备写一篇。注意本篇笔记只限于个人交流使用,不用做商业活动。如由此出现的后果,请自行承担。好了话不多说,开始今天的介绍。本篇笔记适用于JetBrains全家桶系列(Pycharm,Webstorm,IntelliJ idea),详细软件点这里JetBrains全家桶。
啃饼思录
2018/10/15
2.9K1
IntelliJ IDEA 2023.2 最新版如何试用?IntelliJ IDEA 2023.2最新版学生试用方法
C站下载地址: https://download.csdn.net/download/qq_44866828/85451377
猫头虎
2024/04/08
3140
IntelliJ IDEA 2023.2 最新版如何试用?IntelliJ IDEA 2023.2最新版学生试用方法
正版JetBrains的IDEA账号,可直接登录使用IDEA
通过补丁可以永久激活 IDEA,前面 IDEA 安装方式都是一样的,主要是后面的步骤,注意看后面就行~
Java鱼头
2022/12/05
2.7K1
正版JetBrains的IDEA账号,可直接登录使用IDEA
Pycharm2018.2版本激活-亲测有效
今天晚上5点的时候,想写点python代码,想法在早上就有了,但是一直没有时间去写,到了晚上是终于有时间了,但是打开pycharm提示我没激活,让我激活软件(之前试用过,所以试用是不能点击的了)。那就乖乖地去激活软件吧!
申霖
2020/04/17
1.5K0
Pycharm2018.2版本激活-亲测有效
推荐阅读
相关推荐
go语言下载及安装「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档