责任链模式

Android进阶之设计模式

责任链模式

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

使用场景:

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

举个工作中的例子:

你需要报销,你找你的组长,要报销,发现额度比较高,自己没有权利批复,他就找部门经理,经理发现同样的困境,找总经理报账.

//抽象领导者
public abstract class Leader {
    public Leader nextHandler;// 上一级领导处理者

    //处理报账请求 ,
    public final void handleRequest(int money){

        if (money <= limit()){
            handle(money);
        }else {
            if (null!=nextHandler){
                nextHandler.handleRequest(money);
            }
        }
    }

    //自身能批复的额度权限
    protected abstract int limit();

    //处理报账行为
    protected abstract void handle(int money);

}

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

    @Override
    protected void handle(int money) {
        System.out.println("组长批复报销 :"+money+"元");
    }
}
public class Director extends Leader{
    @Override
    protected int limit() {
        return 5000;
    }

    @Override
    protected void handle(int money) {

        System.out.println("主管批复报销了 :" +money+"元");
    }
}

public class Manager extends Leader{
    @Override
    protected int limit() {
        return 10000;
    }

    @Override
    protected void handle(int money) {
        System.out.println("经理批复宝箱:"+money+"元");
    }
}

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

    @Override
    protected void handle(int money) {

        System.out.println("老板批复报销 :"+money+"元");
    }
}

Client 使用:

    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(50000);

   
}

这里面有一个就是 如果组长不在,可以直接找主管报账,这也是责任链模式的灵活之处, 请求的发起可以从责任链的任何一个节点处开始,同时也可以改变责任链内部传递的规则,
责任链中的处理者对象,有两个行为,一是处理请求,二是转发给下一个节点,不允许某个处理者在处理了请求后,又将请求对象转送给上一个节点的情况. 责任链分为两种,一种是 请求被某个处理对象处理, 这个叫纯的责任链. 二是 所有对象均未对其进行处理,这个 是不纯的责任链.

推荐阅读更多精彩内容