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

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

② 怎么组成一条链


继续跟 networkInterceptors,定义了一个公共获取拦截器列表的方法:


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


看下哪里用到了,定位到 RealCall.getResponseWithInterceptorChain() 中:


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


把拦截器全加到列表里,等下按顺序走,很好理解,然后是这个 RealInterceptorChain,关注下传入参数,除了关注interceptors列表外,还要关注一个 index,传入的值为0。


然后下面调用了 chain.proceed(originalRequest) 返回了一个Response对象,点进去类看看:


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


核心代码是圈住那里,拆解下步骤:


  • 创建一个新的RealInterceptorChain,还是传入拦截器列表,但 index + 1


  • 根据游标获取 当前的拦截器,调用拦截器的 intercept() 方法把新的Chain作为参数传入;


这里其实就是 递归,先回到一开始的接口:


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


责任链模式有两个要点:如何往后传递处理结果何时结束传递


第一点传递很好理解:


Interceptor实现类调用 intercept(Chain) 往下传递Chain实例,实例中包含了拦截器列表下一个拦截器的下标处理后的request实例 等。


第二点何时结束:


最后一个拦截器调用 chain.proceed() 返回Response实例为止,而这个实例会往前传递,前面调用了 chain.proceed() 的拦截器可以获得Response实例并进行加工(如打日志),第一个调用了 chain.proceed() 的拦截器得到的就是处理完后的Response。


所以OkHttp的拦截器/过滤器是 双向 的,而Chain接口就是链接其中的链条:


  • 前 → 后:request()获得当前request实例,拦截器可对请求进行加工,可也调用intercept往下传递Chain;


  • 后 → 前:proceed()获得当前response实例,拦截器可对响应进行加工,作为返回值往上传;


真是妙啊!!!普通责任链从头到尾单向,OkHttp利用递归return活活正成了双向,TQL~


得找机会用上,以上就是本节的全部内容,谢谢~


相关文章
|
3月前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
3月前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
28 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实现] 行为型~备忘录模式