美文网首页
设计模式_责任链模式_2021-03-11

设计模式_责任链模式_2021-03-11

作者: 整个橘子 | 来源:发表于2021-03-11 21:33 被阅读0次

    链接:https://leetcode-cn.com/leetbook/read/design-patterns/9e9hfr/

    适用场景

    责任链主要用于处理 职责相同,程度不同的类
    比如菜鸟->普通->优秀程序员组成一条责任链,问题都统一交给菜鸟程序员,如果问题不能够解决,则交个下一个处理。

    优缺点

    优点:
    降低了对象之间的耦合度。在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。

    扩展性强,满足开闭原则。可以根据需要增加新的请求处理类。

    灵活性强。可以动态地改变链内的成员或者改变链的次序来适应流程的变化。

    简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的条件判断语句。

    责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。不再需要 “项目经理” 来处理所有的责任分配任务。

    缺点:
    不能保证每个请求一定被处理,该请求可能一直传到链的末端都得不到处理。
    如果责任链过长,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
    责任链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于责任链拼接次序错误而导致系统出错,比如可能出现循环调用。

    public abstract class Programmer {
        protected Programmer next;
    
        public void setNext(Programmer next) {
            this.next = next;
        }
    
        abstract void handle(Bug bug);
    }
    
    在这个抽象类中:
    next 对象表示如果自己解决不了,需要将责任传递给的下一个人;
    handle 方法表示自己处理此 bug 的逻辑,在这里判断是自己解决或者继续传递
    
    
    public class NewbieProgrammer extends Programmer {
    
        @Override
        public void handle(Bug bug) {
            if (bug.value > 0 && bug.value <= 20) {
                solve(bug);
            } else if (next != null) {
                next.handle(bug);
            }
        }
    
        private void solve(Bug bug) {
            System.out.println("菜鸟程序员解决了一个难度为 " + bug.value + " 的 bug");
        }
    }
    
    public class NormalProgrammer extends Programmer {
    
        @Override
        public void handle(Bug bug) {
            if (bug.value > 20 && bug.value <= 50) {
                solve(bug);
            } else if (next != null) {
                next.handle(bug);
            }
        }
    
        private void solve(Bug bug) {
            System.out.println("普通程序员解决了一个难度为 " + bug.value + " 的 bug");
        }
    }
    
    public class GoodProgrammer extends Programmer {
    
        @Override
        public void handle(Bug bug) {
            if (bug.value > 50 && bug.value <= 100) {
                solve(bug);
            } else if (next != null) {
                next.handle(bug);
            }
        }
    
        private void solve(Bug bug) {
            System.out.println("优秀程序员解决了一个难度为 " + bug.value + " 的 bug");
        }
    }
    
    
    
    //测试类
    public class Client4 {
        @Test
        public void test() {
            NewbieProgrammer newbie = new NewbieProgrammer();
            NormalProgrammer normal = new NormalProgrammer();
            GoodProgrammer good = new GoodProgrammer();
    
            Bug easy = new Bug(20);
            Bug middle = new Bug(50);
            Bug hard = new Bug(100);
    
            // 组成责任链
            newbie.setNext(normal);
            normal.setNext(good);
    
            // 从菜鸟程序员开始,沿着责任链传递
            newbie.handle(easy);
            newbie.handle(middle);
            newbie.handle(hard);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:设计模式_责任链模式_2021-03-11

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