责任链模式(可以让多个对象可能都能够处理某个请求)

源码地址 https://github.com/DingMouRen/DesignPattern
责任链模式(可以让多个对象可能都能够处理某个请求)_第1张图片
简化版责任链模式.png
  • Handler 抽象处理者,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用
  • ConcreteHandler 具体处理者,对请求进行处理,如果不能处理就将该请求转发给下一个节点上的处理兑对象
定义

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

使用场景
  • 多个对象可以处理同一请求,但具体哪个对象处理需要在运行时动态决定
  • 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
  • 需要动态指定一组对象处理请求
协作

当客户端提交一个请求时,请求沿链传递直至一个ConcreteHandler对象负责处理它

责任链模式(可以让多个对象可能都能够处理某个请求)_第2张图片
非简化版责任链模式.png

非简化版责任链模式的代码演示请到 源码

举个栗子

出差报账是经常遇到的,在公司里如果额度很大的话,就得一级一级的向上申报,每级领导审批的额度是有最大限制的,这里就用这个例子。但是这里不再将请求封装成对象了,报账的额度就是请求。

//抽象处理者:领导们╮(╯▽╰)╭
public abstract class Leader {
    public Leader nextLeader;//上一任领导,对应下一个处理者对象

    /**
     * 处理报账
     * @param money 请求报账的额度
     */
    public final void handleRequest(int money){
        if (money <= limit()){
            handle(money);
        }else {
            if (null != nextLeader) nextLeader.handleRequest(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.println(getClass().getSimpleName()+"批复了"+money);
    }
}
//具体处理者:主管
public class Director extends Leader{
    @Override
    public int limit() {
        return 5000;
    }

    @Override
    public void handle(int money) {
        System.out.println(getClass().getSimpleName()+"批复了"+money);
    }
}

使用
    public static void main(String[] args) {
        //构建处理者对象:领导们
        Leader groupLeader = new GroupLeader();
        Leader directorLeader = new Director();
        Leader managerLeader = new Manager();
        Leader  boss = new Boss();
        //设置处理的责任链关系
        groupLeader.nextLeader = directorLeader;
        directorLeader.nextLeader = managerLeader;
        managerLeader.nextLeader = boss;
        //发起报账的请求
        groupLeader.handleRequest(3000);
    }
总结

责任链模式优点是实现了请求者和处理者关系的解耦,提高了代码的灵活性。最大的缺点就是在链中请求处理者的遍历。如果处理者太多,那么遍历就会影响性能咯。

你可能感兴趣的:(责任链模式(可以让多个对象可能都能够处理某个请求))