一、概述
一般问题:多个对象可以处理同一请求,具体由哪个对象处理则在运行时动态决定
核心方案:将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止
设计意图:一般情况下请求一个对象可以直接调用其方法,这样请求发出者与处理者耦合;如果同一请求可以被多个对象处理,根据具体条件不同调用不同对象方法,这样请求发出者与多个处理者都耦合在一起;为了简化请求发出者的逻辑,同时解耦请求发出者和处理者,责任链模式将所有请求处理者连接成一条链,同时沿着这条链传递请求,直到请求被执行为止。
责任链模式UML图如下:
Handler本身维护下一个处理者实例。
二、运用实践
Android的事件分发机制就用到了责任链模式。Android的View和ViewGroup层层组合呈树型结构,每层都可以处理Touch事件,最终由谁来处理,需要事件拦截机制决定。
View树就是一条处理链,事件层层向下传递,正常情况下一个完整传递如下图:
假如事件在LinearLayout层被处理,则不会再往下分发:
三、总结
总结:责任链模式是一种行为型设计模式,目的是将请求的发起与执行解耦。
优点:
- 降低耦合度,请求的发送与接收解耦
- 处理类可以灵活增减
缺点:
- 不能保证请求一定被接收
- 系统性能将受到一定影响