责任链模式

定义

使多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

使用场景

  1. 多个对象都可以处理该请求,具体由哪个对象处理则由运行时动态决定。
  2. 在请求处理者不明确的情况下,向多个对象中的一个提交一个请求。
  3. 需要动态指定一组对象处理请求。

实现方式

背景:小敏公派出国进修回来,需要报销5万元的差旅费,于是她便向她的组长提出报销申请。但由于金额过大,组长无权审批,便逐级上报至BOSS。
解决方案:责任链模式

Handler(抽象处理类)

public abstract class Leader {
    protected Leader nextHandler;  // 下一个处理者

    /**
    * 处理请求
    * @param money 能批复的报账额度
    */
    public final void handleRequest(int money) {
        if (money < limit()) {
            // 报账额度 < 批复限额,直接处理
            handle(money);
        } else {
            // 否则,直接传递到下一个处理者
            nextHanlder.handleRequest(money);
        }
    }
  
    // 设置批复限额
    public abstract int limit();
    // 具体处理请求事项
    public abstract void handle(int money);
}

ConcreteHandler(具体处理类)

组长

public class GroupLeader extends Leader {
    @Override
    public int limit() {
        return 1000;
    }

    @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 + "元的报销申请核准通过");
    }
}  

Boss

public class Boss extends Leader {
    @Override
    public int limit() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        System.out.println("经老板审核,金额为" + money + "元的报销申请核准通过");
    }
}  

Client(客户类小敏)

public class ClientXiaomin {
    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;

        // 想组长提交5W报销请求
        groupLeader.handleRequest(50000);

    }
}

优缺点

优点

  • 可以将请求者与处理者解耦,提高代码灵活性

缺点

  • 对请求处理者的多次遍历,如果处理者太多,则会影响性能。(在递归调用中,需慎重使用)

注意

Android 源码中的责任链模式,参考 ViewGroup 中的 dispatchTouchEvent(MotionEvent e) 方法(事件分发)。当 onTouchEvent 返回 true 时,则消费了当前事件,不再继续往下传递。如果为 false,则继续传递,类似一条责任链。
而在 Android 中的 有序广播 Ordered Broadcast 和责任链模式很相近,可以通过它实现全局责任链事件处理。

你可能感兴趣的:(责任链模式)