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

简介: 本文对应设计模式与范式:行为型(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不是直接调,而是:


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


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


相关文章
|
3月前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
3月前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
31 0
|
3月前
|
设计模式 Java
Java设计模式之责任链模式详解
Java设计模式之责任链模式详解
|
3月前
|
设计模式 存储
行为型设计模式之观察者模式
行为型设计模式之观察者模式
|
3月前
|
设计模式 算法
行为型设计模式
行为型设计模式
|
3月前
|
设计模式 架构师 NoSQL
设计模式第六讲:责任链模式和迭代器模式详解
遍历任务交由迭代器完成,这简化了聚合类。  C. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
156 0
|
4月前
|
设计模式 Go
[设计模式 Go实现] 行为型~状态模式
[设计模式 Go实现] 行为型~状态模式
|
4月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
|
4月前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
4月前
|
设计模式 存储 Go
[设计模式 Go实现] 行为型~备忘录模式
[设计模式 Go实现] 行为型~备忘录模式