把书读薄 | 《设计模式之美》设计模式与范式(行为型-责任链模式)(中)

简介: 本文对应设计模式与范式:行为型(62-63),责任链模式 (Chain of Responsibility Pattern),常用于框架开发中,为框架提供扩展点,让框架使用者在不修改框架源码的情况下,基于扩展点添加新的功能,具体点说,最常用来开发框架的 拦截器 和 过滤器。

0x3、责任链的 "纯与不纯"


  • 纯责任链 → 要么承担全部责任,要么责任推给下家,不允许在某处承担了部分或全部责任,然后又把责任推给下家;


  • 不纯责任链 → 责任在某处部分或全部处理后,还往下传递;


0x4、加餐:模式应用示例 → OkHttp拦截器核心原理


Android著名的第三方请求库OkHttp中的拦截器,就用到了责任链模式,我们来扒一扒具体的实现原理~


① 两个小知识点


通过继承 Interceptor 接口,重写intercept(Chain)函数来实现一个自定义拦截器,看下接口:


网络异常,图片无法展示
|


接着通过 addInterceptor() 函数添加自定义拦截器,跟下:


网络异常,图片无法展示
|


看下 interceptors


网络异常,图片无法展示
|


呕吼,拦截器列表,把自定义拦截器加到其中,看下哪里用到这个列表了:


网络异常,图片无法展示
|


这里有两个知识点:


  • 1、利用Builder模式,将复杂对象与它的表示进行分离;


  • 2、Util.immutableList 实际上调用的 Collections.unmodifiableList,用于构造一个不能修改的列表;


不能修改的列表,底层原理


继承List,对修改元素的函数进行重写,抛出UnsupportedOperationException异常


网络异常,图片无法展示
|


可以写个简单的代码验证下:


网络异常,图片无法展示
|


运行后报错,异常如下:


网络异常,图片无法展示
|


但真的就不可变吗,如果换成修改原列表呢?


网络异常,图片无法展示
|


运行打印结果如下:


网络异常,图片无法展示
|


操作原列表,导致不可变的列表发生了改变,看源码很好理解:


网络异常,图片无法展示
|


网络异常,图片无法展示
|


代理模式,即控制对目标对象的访问,UnmodifiableList只是对目标对象裹了一层,不经过它通过其他方式修改了目标对象,那肯定会发生改变啊。所以OkHttp不是直接调,而是:


网络异常,图片无法展示
|


基于原始列表,创建了一个 新的列表,杜绝了外部对目标对象的改动,真是妙啊!


相关文章
|
22天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
54 9
|
10天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
26 0
|
21天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
11 0
|
24天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
37 0
|
1月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
42 0
|
2月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
1月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
25 0
|
5月前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
5月前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
55 0
|
5月前
|
设计模式 Java
Java设计模式之责任链模式详解
Java设计模式之责任链模式详解