责任链模式的标准定义:
责任链模式是行为型设计模式之一。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有该对象处理它为止。
责任链模式的使用场景:
1)多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
2)在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
3)需要动态指定一组对象处理请求。
责任链模式的角色:
Handler:
抽象处理者角色。声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用。
ConcreteHandler:
具体处理者角色。对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。
责任链模式的简单实现
简单代码业务场景介绍:某员工出差回来一共花费5万,找组长报销,组长一看报销金额超过他的审批权限,于是组长拿着票据去找总监,结果,总监一看报销金额也超过他的审批权限,二话不说直奔老板办公室。
第一步:声明一个抽象的领导类,如下所示:
/***
*处理者抽象类
*/
public abstract class Leader {
protected Leader nextHandler;//上一级领导处理者
/***
* 处理报账请求
* @param money 能批复的报账额度
*/
public final void handleRequest(int money) {
}
/***
* 自身能批复的额度权限
* @return 额度
*/
public abstract int limit();
/***
* 处理报账的行为
* @param money 具体的金额
*/
public abstract void handle(int money);
}
/***
* 组长
*/
public class GroupLeader extends Leader {
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.print("组长批复报销" + money + "元");
}
}
/***
* 总监
*/
public class ManagerLeader extends Leader {
@Override
public int limit() {
return 20000;
}
@Override
public void handle(int money) {
System.out.print("总监批复报销" + money + "元");
}
}
/***
* 老板
*/
public class BossLeader extends Leader {
@Override
public int limit() {
return 100000;
}
@Override
public void handle(int money) {
System.out.print("老板批复报销" + money + "元");
}
}
/***
* 员工X
*/
public class StaffX {
public static void main(String[] args) {
//构造各个领导对象
GroupLeader mGroupLeader = new GroupLeader();
ManagerLeader mManagerLeader = new ManagerLeader();
BossLeader mBossLeader = new BossLeader();
//设置上一级领导处理对象
mGroupLeader.nextHandler = mManagerLeader;
mManagerLeader.nextHandler = mBossLeader;
//发起报账申请
mGroupLeader.handleRequest(5000);
}
}
以上就是一个简单的责任链模式实现,在Android源码中比较类似的实现莫过于对事件的分发处理,感兴趣的可以看下Android相关的代码,这里就不做记录了。
在上面的实现中,可能有的人会想,要是组长不在,可以直接找总监报销吗?答案是肯定的,这也是责任链模式的灵活之处,请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则。
对于责任链中的一个处理者对象,其只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者在处理了请求后有将请求转送给上一个节点的情况。对于一条责任链来说,一个请求最终只有两种情况,一是被某个处理对象所处理,另一个就是所有对象均未对其处理,对于前一中情况我们称该责任链为纯的责任链;对于后一种情况我们称为不纯的责任链。
在实际应用中,我们所见到的责任链模式大多数为不纯的责任链
责任链模式的小结
优点
可以对请求者和处理者关系解耦,提高代码的灵活性。
缺点
责任链最大的缺点是对链中的请求处理者的遍历,如果处理者太多,那么遍历必定会影响性能,特别是在一些递归调用中,我们一定要慎重使用这个模式