设计模式 | 责任链模式介绍、使用案例、源码应用

目录

责任链模式介绍

责任链模式实例

责任链模式在源码中的应用


责任链模式介绍

定义:为请求创建一个接受此次请求对象的链

使用场景:一个请求处理需要多个对象中的一个或多个协助处理

优点:请求的发送者和接收者解耦;可以动态组合

 缺点:责任链太长或处理的时间太长,影响性能;责任链有可能会过多

责任链模式实例

本文以发布教程为例讲解责任链模式的实例应用。某学习网站发布课程需要同时包含视频和手记,且二者的审核是分开的,如果上传的教程中不含有手记则直接驳回,否则进入视频审核。

创建课程类,包含名称、手记、视频三个字段,

/**
 * 课程类
 */
public class Course {
    private String name;
    private String article;
    private String video;
    public String getName() {
        return name;
    }
    public String getArticle() {
        return article;
    }
    public String getVideo() {
        return video;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setArticle(String article) {
        this.article = article;
    }
    public void setVideo(String video) {
        this.video = video;
    }
    @Override
    public String toString() {
        return "Course{" +
                "name='" + name + '\'' +
                ", article='" + article + '\'' +
                ", video='" + video + '\'' +
                '}';
    }
}

创建审核父类,此类中要声明一个自身对象,目的是可以动态的设置下一个审批节点

/**
 * 审核父类
 */
public abstract class Approver {
    protected Approver approver;
    public void setNextApprover(Approver approver){
        this.approver = approver;
    }
    public abstract  void deploy(Course course);
}

创建手记审核类,此类要继承审批父类,重写发布方法,在发布方法中判断课程是否包含了手记,不包含则驳回,包含手记的话此环节审核通过,进入下一个审批环节,

/**
 * 手记审核类
 */
public class ArticleApprover extends Approver{
    @Override
    public void deploy(Course course) {
        if(course.getArticle() != "" && null != course.getArticle()){
            System.out.println(course.getName()+"含有手记,批准");
            if(approver != null){
                approver.deploy(course);
            }
        }else{
            System.out.println(course.getName()+"手记为空,驳回");
        }
    }
}

创建视频审核类,视频审核类和手记审核类作用相同

/**
 * 视频审核类
 */
public class VideoApprover extends Approver{
    @Override
    public void deploy(Course course) {
        if(course.getVideo() != "" && null != course.getVideo()){
            System.out.println(course.getName()+"含有视频,批准");
            if(approver != null){
                approver.deploy(course);
            }
        }else{
            System.out.println(course.getName()+"视频为空,驳回");
        }
    }
}

创建测试类,声明两个审核对象和课程,并设置下一个审批节点

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        ArticleApprover articleApprover = new ArticleApprover();
        VideoApprover videoApprover = new VideoApprover();
        Course course = new Course();
        course.setName("策略模式精讲");
        course.setArticle("策略模式精讲手记");
        course.setVideo("策略模式精讲视频");
        articleApprover.setNextApprover(videoApprover);
        articleApprover.deploy(course);
    }
}

输出结果

修改课程类的赋值,不设置课程的手记,输出结果

设计模式 | 责任链模式介绍、使用案例、源码应用_第1张图片

在实际业务中各个审核环节相互独立,符合条件进入下一环,否则驳回,此程序符合预期

责任链模式在源码中的应用

1.servlet的过滤器:javax.servlet.Filter 中的doFilter方法


你可能感兴趣的:(设计模式)