本文链接:https://rainmonth.github.io/posts/J180324.html
模式定义
责任链模式,行为模式的一种,一个请求有多个对象处理,这些对象可以看成一条链,具体由哪个对象处理,有判断条件来决定,如果当前对象不能处理,则交给下一个对象处理,知道有对象处理为止。OkHttpClient就是利用责任链模式进行拦截器的处理的。
模式特点
将请求和处理分离开来,进行解耦。
涉及到的角色
- 待处理的任务
- 抽象的任务处理者(Handler):定义一个处理任务的抽象类,如果需要可以定义一个方法用来设定和返回下一个具体任务处理者的饮用;
- 具体的任务处理者(ExactHandler):接收到请求后,如果满足处理条件,直接处理请求;不满足,将请求交给下家处理。所以具体处理者是持有下一个具体处理者对象的引用的,因而当前具体处理者可以访问下一个处理者。
使用场景
- 有多个对象处理请求,如下例中,项目经理、部门经理及总经理都能处理请假这一请求;
- 不知道具体由谁处理请求,如下例中,小明只是提交了请假的请求,他不必关心到底是谁处理的,只要知道处理结果就可以了
- 处理请求的对象间的处理链可以动态设置;
举个栗子
一般公司有一个很常见的场景,那就是请假。小明所在的A公司又如下规定;
- 员工请假3天以内,由项目经理审批;
- 员工请假3至5天,由部门经理审批;
- 员工请假5天以上,由总经理审批;
代码实现
抽象处理者
1 | /** |
具体处理者
项目经理
1 | /** |
部门经理
1 | /** |
总经理
1 | /** |
实际情境模拟
1 | public class Client { |
输出
1 | 10天请假,总经理审批通过 |
在Android中的应用
View的事件处理
用户点击了屏幕,产生了一个touch请求,交给界面上的View处理,如果第一层需要处理,就处理;不需要处理,交友下一层处理,依次类推,这里处理touch的每一层的View就是上面的具体处理者,View就是抽象处理者,View的dispatchTouchEvent方法就相当于责任链的构建者,由它来安排touch请求的处理顺序。
有序广播(Ordered Broadcast)
Ordered Broadcast的接收者将按预先声明的优先级依次接收 Broadcast 。如:A的级别高于B , B高于C 。那么,Broadcast先传给A ,再传给B ,最后传给C 。优先级声明在元素的Android:priority属性中,数越大优先级别越高,取值范围为 -1000~1000 。