责任链模式

来源:互联网 发布:邮箱域名大全 编辑:程序博客网 时间:2024/06/10 23:51

模式的定义

一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。

例子:员工出差需要资金,然后找领导审批,a,b,c领导,层层审批,如果a可以审批就结束,不然b审批,不能审批到c,责任层层上传.直到一个能处理问题的领导

简单实现的介绍

责任链模式最原始的裸体结构:分支语句:

public class SimpleResponsibility {
public static void main(String[] args) {
int request = (int) (Math.random() * 3);
switch (request) {
case 0:
System.out.println(“SMBother handle it: ” + request);
break;
case 1:
System.out.println(“Aige handle it: ” + request);
break;
case 2:
System.out.println(“7Bother handle it: ” + request);
break;
default:
break;
}
}
}
上面的这段代码其实就是一种最简单的责任链模式,其根据request的值进行不同的处理。当然这只是个不恰当的例子来让大家尽快对责任链模式有个简单的理解,因为可能很多童鞋第一次听说这个模式,

Android源码中的模式实现

Android中关于责任链模式比较明显的体现就是在事件分发过程中对事件的投递,其实严格来说,事件投递的模式并不是严格的责任链模式,但是其是责任链模式的一种变种体现,在ViewGroup中对事件处理者的查找方式如下:
ViewGroup事件投递的递归调用就类似于一条责任链,一旦其寻找到责任者,那么将由责任者持有并消费掉该次事件,具体的体现在View的onTouchEvent方法中返回值的设置(这里介于篇幅就不具体介绍ViewGroup对事件的处理了),如果onTouchEvent返回false那么意味着当前View不会是该次事件的责任人将不会对其持有,如果为true则相反,此时View会持有该事件并不再向外传递。

问题

责任链模式也一样,有点显而易见,可以对请求者和处理者关系的解耦提高代码的灵活性,责任链模式的最大缺点是对链中责任人的遍历,如果责任人太多那么遍历必定会影响性能,特别是在一些递归调用中,要慎重。

原创粉丝点击