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

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


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


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


相关文章
|
2月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
4月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
4月前
|
设计模式 算法 Java
行为型设计模式-策略模式(Strategy Pattern)
行为型设计模式-策略模式(Strategy Pattern)
|
4月前
|
设计模式 Dubbo Java
聊聊Java设计模式-责任链模式
责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
84 1
聊聊Java设计模式-责任链模式
|
17天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
17天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
18天前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
18天前
|
设计模式 Go
[设计模式 Go实现] 行为型~职责链模式
[设计模式 Go实现] 行为型~职责链模式
|
1月前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
14 0
|
3月前
|
设计模式 Java 测试技术
浅谈设计模式 - 责任链模式(十四)
浅谈设计模式 - 责任链模式(十四)
52 0