责任链模式
属行为型设计模式,「使多个对象(处理者)都有机会处理请求,从而避免请求发起者和处理者之间的耦合关系。将多个处理者连成一条链,并沿着这条链传递该请求,直到有处理者处理它为止」。
这里的链就和数据结构里的链表很类似,
class TrainNode {
public TrainNode next;
}
前一级的处理者持有着下一级的处理者对象引用,这样一来,如果自己处理不了的请求就可以传递给下一级去处理。
所以作为处理者要明确这么几件事,1. 知道自己的处理等级,2. 当请求来临时处理相应等级的请求,3. 如果处理不了,就将请求交给下一级处理。
请求的发起者只要知道链表头(即第一个处理者)即可,因为有了链表头请求事件就可以沿着责任链被响应处理。这也是实现解耦的关键。同时,请求者也不需要关心请求的具体处理过程,反正总能得到请求响应。
再有一个场景类,负责封装一下处理者的责任链生成过程。这样一来,仅提供给请求者链表头就可以了。
优缺点
- 请求与处理解耦,提高系统的灵活性。
- 性能问题,每个请求都要沿着责任链进行传递处理(这也是链表结构的缺点,不能像数组那样随机访问)。
- 问题调整追踪不好定位。
使用场景
责任链模式的使用场景有点和策略模式的类似,区别是,策略模式由高层就决定了使用什么策略,而责任链更像是高层只负责责任链的建立,实际处理则在请求产生后由责任链来决定。
所以其实策略模式能使用的场景,责任链模式也就可以使用。
在 Android 中的使用
典型的使用是 View 的点击事件分发机制。Android 基本功-事件分发机制 可以通过这篇文章看下大致过程。其次,据说 OkHTTP 中也运用了责任链模式,但这个还有待探究,后续找时间分析下。
参考内容
「设计模式之禅(第 2 版)」
「Android 源码设计模式解析与实战」
网友评论