美文网首页
责任链模式

责任链模式

作者: kafeimao | 来源:发表于2020-11-12 12:14 被阅读0次

    按一定顺序执行 "链" 上的每一个节点

    责任链模式中的角色:抽象处理对象,具体处理对象,责任链

    以博客审核流程为例来说明,假设博客的发布需要经过,安全审核,盗版审核,质量审核

    利用spring容器带来的便利

    抽象处理对象

    @Data
    public abstract class Audit {
        protected Audit nextAudit;
        public abstract void audit();
    }
    
    image.gif

    具体处理对象

    @Component
    public class SecurityAudit extends Audit{
        @Override
        public void audit() {
            System.out.println("安全审核");
            if(nextAudit!=null){ nextAudit.audit(); }
        }
    }
    
    image.gif
    @Component
    public class QualityAudit extends Audit{
        @Override
        public void audit() {
            System.out.println("质量审核");
            if(nextAudit!=null){ nextAudit.audit(); }
        }
    }
    
    image.gif
    @Component
    public class PirateAudit extends Audit{
        @Override
        public void audit() {
            System.out.println("盗版审核");
            if(nextAudit!=null){ nextAudit.audit(); }
        }
    }
    
    image.gif

    责任链

    责任链的初始化方式很多,总之能说明链中每个节点的顺序就行,也可以直接写死每个节点的下一个节点是什么,不利于维护和扩展一般不会这么做

    @Configuration
    @ComponentScan("com.shyf.audit")
    public class AuditConfig {
        //责任链初始化配置,这里指明了各个节点在责任链中的顺序
        private static List<String> auditOrderList = new ArrayList<String>(){{
            add("securityAudit");
            add("pirateAudit");
            add("qualityAudit");
        }};
        @Bean
        //责任链初始化,返回责任链的第一个节点
        public Audit audit(ApplicationContext applicationContext){
            Audit audit = null;
            Audit temp = null;
            for (String s:auditOrderList) {
                Audit bean = (Audit)applicationContext.getBean(s);
                if(audit==null){
                    audit = bean;
                    temp = audit;
                }else{
                    temp.setNextAudit(bean);
                    temp = temp.getNextAudit();
                }
            }
            return audit;
        }
    }
    
    image.gif

    调用

    public class AppTest {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                AuditConfig.class);
            Audit audit = (Audit)context.getBean("audit");
            audit.audit();
        }
    }
    
    image.gif

    结果和责任链初始化配置中的一样

    image image.gif

    扩展

    新增一个其他审核,放在盗版审核后面

    @Component
    public class OtherAudit extends Audit{
        @Override
        public void audit() {
            System.out.println("其他审核");
            if(nextAudit!=null){nextAudit.audit();}
        }
    }
    
    image.gif
    //责任链初始化配置,这里指明了各个节点在责任链中的顺序
        private static List<String> auditOrderList = new ArrayList<String>(){{
            add("securityAudit");
            add("pirateAudit");
            add("otherAudit");
            add("qualityAudit");
        }};
    
    image.gif

    结果

    image image.gif

    相关文章

      网友评论

          本文标题:责任链模式

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