0x3、责任链的 "纯与不纯"
- 纯责任链 → 要么承担全部责任,要么责任推给下家,不允许在某处承担了部分或全部责任,然后又把责任推给下家;
- 不纯责任链 → 责任在某处部分或全部处理后,还往下传递;
0x4、加餐:模式应用示例 → OkHttp拦截器核心原理
Android著名的第三方请求库OkHttp中的拦截器,就用到了责任链模式,我们来扒一扒具体的实现原理~
① 两个小知识点
通过继承 Interceptor
接口,重写intercept(Chain)函数来实现一个自定义拦截器,看下接口:
网络异常,图片无法展示
|
接着通过 addInterceptor()
函数添加自定义拦截器,跟下:
网络异常,图片无法展示
|
看下 interceptors
:
网络异常,图片无法展示
|
呕吼,拦截器列表,把自定义拦截器加到其中,看下哪里用到这个列表了:
网络异常,图片无法展示
|
这里有两个知识点:
- 1、利用Builder模式,将复杂对象与它的表示进行分离;
- 2、Util.immutableList 实际上调用的 Collections.unmodifiableList,用于构造一个不能修改的列表;
不能修改的列表,底层原理
继承List,对修改元素的函数进行重写,抛出UnsupportedOperationException异常
网络异常,图片无法展示
|
可以写个简单的代码验证下:
网络异常,图片无法展示
|
运行后报错,异常如下:
网络异常,图片无法展示
|
但真的就不可变吗,如果换成修改原列表呢?
网络异常,图片无法展示
|
运行打印结果如下:
网络异常,图片无法展示
|
操作原列表,导致不可变的列表发生了改变,看源码很好理解:
网络异常,图片无法展示
|
网络异常,图片无法展示
|
代理模式,即控制对目标对象的访问,UnmodifiableList只是对目标对象裹了一层,不经过它通过其他方式修改了目标对象,那肯定会发生改变啊。所以OkHttp不是直接调,而是:
网络异常,图片无法展示
|
基于原始列表,创建了一个 新的列表,杜绝了外部对目标对象的改动,真是妙啊!