1.责任链模式介绍
责任链模式,是行为型模式之一。我们将多个节点首尾相连所构成的模型称为链。对于链式结构,每个节点都可以被拆开再链接,因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端出发,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样一种模式称为责任链模式。2.责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。3.责任链模式的使用场景
多个对象可以处理同一请求,但具体由哪一个对象处理则在运行状态决定。在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
4.责任链模式的UML类图
5.代码实现
在公司规定,请假3天以内由经理审批,请假5天以内由总监审批,请假5天以上由总经理审批。如果我们请假,将请假条交由经理处理。如果我们请假10天,超过了经理的处理权限,经理将假条提交至总监。10天假期又超过了总监的处理权限,总监由交由总经理审批,最终将假期审批下来。
假如有天请假,经理不在,我们又可直接找总监请假,具体代码该如何实现呢?
1.抽象领导者
/**
* 抽象领导者
* Created by Teaphy
* 2016/3/30.
*/
public abstract class Leader {
protected Leader nextHandler;
/**
* 处理请假请求
* @param days 请假天数
*/
public final void handlerRequest(int days) {
if (days < limit()) {
handle(days);
} else {
if (null != nextHandler) {
nextHandler.handlerRequest(days);
}
}
}
/**
* 自身能批复的天数
* @return 具体天数
*/
public abstract int limit();
/**
* 处理请假行为
* @param days 具体天数
*/
public abstract void handle(int days);
}
2. 具体领导者
/**
* 具体领导者 - 经理
* Created by Teaphy
* 2016/3/30.
*/
public class Manager extends Leader {
/**
* 自身能批复的天数
* @return 具体天数
*/
public int limit() {
return 3;
}
/**
* 处理请假行为
* @param days 具体天数
*/
public void handle(int days) {
System.out.println("Manager 审批假期" + days + "天");
}
}
/**
* 具体领导者 - 总监
* Created by Teaphy
* 2016/3/30.
*/
public class Director extends Leader {
/**
* 自身能批复的天数
* @return 具体天数
*/
public int limit() {
return 5;
}
/**
* 处理请假行为
* @param days 具体天数
*/
public void handle(int days) {
System.out.println("Director 审批假期" + days + "天");
}
}
/**
* 具体领导者 - 总经理
* Created by Teaphy
* 2016/3/30.
*/
public class Boss extends Leader {
/**
* 自身能批复的天数
* @return 具体天数
*/
public int limit() {
return Integer.MAX_VALUE;
}
/**
* 处理请假行为
* @param days 具体天数
*/
public void handle(int days) {
System.out.println("Boss 审批假期" + days + "天");
}
}
3.测试类
/**
* Created by Teaphy
* 2016/3/30.
*/
public class TestIteratorPattern {
public static void main(String[] args) {
Manager mManager = new Manager();
Director mDirector = new Director();
Boss mBoss = new Boss();
// 设置Manager下一个节点
mManager.nextHandler = mDirector;
// 设置Director下一个节点
mDirector.nextHandler = mBoss;
/**
* 请假10天
*/
mManager.handlerRequest(10);
/**
* 请假2天,但经理出差,交由总监审批
*/
mDirector.handlerRequest(2);
}
}
4.输出结果
Boss 审批假期10天
Director 审批假期2天
6.总结
责任链模式的优点在于对请求者和处理者关系解耦,提高代码的灵活性。责任链模式的最大缺点是对链中请求处理者的遍历,如果处理者太多,繁琐的遍历,必然会影响性能,尤其是在一些递归调用中。
在要求性能的应用中,慎重使用责任链模式。
参考资料
1.Android源码分析与设计模式