美文网首页Android设计模式
责任链模式(可以让多个对象可能都能够处理某个请求)

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

作者: 钉某人 | 来源:发表于2017-11-18 17:01 被阅读5次
    源码地址 https://github.com/DingMouRen/DesignPattern
    简化版责任链模式.png
    • Handler 抽象处理者,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用
    • ConcreteHandler 具体处理者,对请求进行处理,如果不能处理就将该请求转发给下一个节点上的处理兑对象
    定义

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

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

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

    非简化版责任链模式.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);
        }
    
    总结

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/pnaevxtx.html