责任链定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
举例:报账申请
//抽象领导者
public abstract class Leader {
//上一级领导处理者
protected Leader nextHandler;
//处理报账请求 money:能批复的报账额度
public final void handleRequest(int money){
if(money<=limit()){
handle(money);
}else{
if(null!=nextHandler)
nextHandler.handleRequest(money);;
}
}
//自身能批复的额度权限
public abstract int limit();
//处理报账行为
public abstract void handle(int money);
}
public class GroupLeader extends Leader{
@Override
public int limit() {
return 100;
}
@Override
public void handle(int money) {
System.out.println("组长批复报销"+money+"元");
}
}
public class Director extends Leader{
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("主管批复报销"+money+"元");
}
}
public class Manager extends Leader{
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("经理批复报销"+money+"元");
}
}
public class Boss extends Leader{
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("老板批复报销"+money+"元");
}
}
测试:
public class Worker {
public static void main(String[] args) {
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
//设置上一级领导处理者对象
groupLeader.nextHandler=director;
director.nextHandler=manager;
manager.nextHandler=boss;
//发起报账申请
groupLeader.handleRequest(60000);;
}
}
结果:
老板批复报销60000元
分析:由于报账金额比较大,最后有老板来处理。需要注意的是在责任链模式中一个请求发送到链中后,前一节点消费部分消息,然后由后续节点继续处理,最终可以有处理结果也可以没有处理结果。
优缺点
优点:将请求和处理分开。提高系统的灵活性。
缺点:1)性能问题,每个请求都是从链头遍历到链尾,如果链比较长,性能需要关注。2)调试不方便,由于采用类似递归的方式,调试的时候逻辑可能比较复杂。