美文网首页
设计模式——责任链模式

设计模式——责任链模式

作者: Utte | 来源:发表于2018-09-10 22:53 被阅读103次

    一、定义

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

    二、适用场景

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

    责任链模式在View事件分发中、OkHttp中都有见到。应用面还是很多的。

    三、实现

    以一个员工报销的场景来说,每一级的领导能报销的项目额度是有最大限制的。

    1. UML
    2. 抽象领导(处理者)

    封装了转发消耗的判断逻辑,剩下判断限制和具体处理交给具体的处理者去实现。

    public abstract class Leader {
        protected Leader nextHandler;
    
        // 统一实现的转发消耗逻辑
        public final void handleRequest(int money) {
            if (money <= limit()) {
                // 消耗
                handle(money);
            } else {
                // 上层领导不空就转交
                if (nextHandler != null) {
                    nextHandler.handleRequest(money);
                }
            }
        }
        // 具体的领导实现具体的额度限制
        public abstract int limit();
        // 具体领导实现具体报销方式
        public abstract void handle(int money);
    
    }
    
    3. 具体领导

    需要实现自己的额度限制方法和具体处理的方法。

    public class Director extends Leader {
        @Override
        public int limit() {
            return 1000;
        }
    
        @Override
        public void handle(int money) {
            System.out.println("director handle " + money);
        }
    }
    
    public class Manager extends Leader {
        @Override
        public int limit() {
            return 10000;
        }
    
        @Override
        public void handle(int money) {
            System.out.println("manager handle " + money);
        }
    }
    
    public class Boss extends Leader {
        @Override
        public int limit() {
            return Integer.MAX_VALUE;
        }
    
        @Override
        public void handle(int money) {
            System.out.println("boss handle " + money);
        }
    }
    
    4. 使用

    自己构造责任链,之后调用Director的处理方法。

    public class Test {
        public static void main(String[] args) {
            Director director = new Director();
            Manager manager = new Manager();
            Boss boss = new Boss();
            // 连接责任链
            director.nextHandler = manager;
            manager.nextHandler = boss;
            // 调用最低级领导的方法
            director.handleRequest(2222);
    
        }
    }
    

    可以看到,Test访问了Director一个处理者,完全不需要知道其他处理者的存在,这就达到了请求和处理的解耦。

    四、小结

    优点:

    请求者和处理者关系解耦,提高代码的灵活性。

    缺点:

    如果处理者过多,遍历会影响性能,特别如果有递归调用时需要慎重。

    相关文章

      网友评论

          本文标题:设计模式——责任链模式

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