x责任链模式

这样一个链,我们把任务从入口扔进去,一直向下找,直到找到真正可以处理任务的一个链节,然后返回。

何时使用责任链?

1.不明确谁来执行任务的时候

从Android的事件分发机制,Okhttp拦截器链中我们可以得知,我们并不知道最终是哪个View消费事件,我们也并不知道Okhttp是使用缓存、获取TCP连接失败还是直接发起网络请求。

2.需要协作完成一项任务的时候。在Okhttp的拦截器链中,有些链并不能处理请求,他们只是对数据进行了二次封装,比如Bridge拦截器。

不适用哪些场景?

这个问题我多次面试时被问到,有点 古怪,但是面试官这样问,自然有其道理。第一是我看了一下一些责任链的实现,是无限循环的,一旦程序不严谨无限循环了,或者循环太多次数,对于性能是一个巨大的浪费。第二是就算没有采用循环实现,有许多的节点要处理,并且要遍历链表,一旦层级过长或者单个任务过大,都会影响性能。主要是因为他是找实现者,在真正找到实现者前,其遍历的节点,都是浪费的。

所以对于高性能要求的场景,是不适用的。

责任链究竟是如何实现的?

 第一种实现:循环链表,找到最终执行任务的链节,执行任务,然后退出循环。

第二种实现:Okhttp的实现。他是 单向链表,向下走,之前的链节的作用可能不会 最终执行请求,但是做一些不可缺少的 事情。找到执行任务处, 向上返回, 因为之前的 操作需要进行一个逆向 操作,就好像zip、unzip。

链表, 有些人喜欢循环链表,进行无限循环。Okhttp确实是无限循环的, 但是他不是采用的循环链表,而是单向链表。如果最终完成了任务,会一层层向上返回结果;如果失败了,也是向上返回,由入口的拦截器进行无限循环,再次向下走。

总结下就是

1.有些链节会执行必须的功能,进行递归实现

2.入口链节控制无线循环

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/81276356