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

简介: 本文对应设计模式与范式:行为型(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~


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


相关文章
|
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源码~行为型] 对象状态及其转换——状态模式
|
17天前
|
设计模式 Go
[设计模式 Go实现] 行为型~迭代器模式
[设计模式 Go实现] 行为型~迭代器模式
|
17天前
|
设计模式 Go
[设计模式 Go实现] 行为型~职责链模式
[设计模式 Go实现] 行为型~职责链模式
|
1月前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
14 0
|
3月前
|
设计模式 Java 测试技术
浅谈设计模式 - 责任链模式(十四)
浅谈设计模式 - 责任链模式(十四)
52 0