也叫职责链模式

作用

一个请求的处理需要多个对象当中的一个或多个协作处理
为请求创建一个接受此请求对象的链,随着链子逐步执行

业务场景:
一个课程发布需要层层审批,所以审批都通过了才可以发布
使用责任链模式来解耦合,让每个审批类各司其职
demo就以审批课程为例

用来被审批的实体类

被用来审批的课程类

  1. @Data
  2. @Accessors(chain = true)
  3. public class Course {
  4. /**
  5. * 课程名
  6. */
  7. private String name;
  8. /**
  9. * 手记
  10. */
  11. private String article;
  12. /**
  13. * 视频
  14. */
  15. private String video;
  16. }

审批抽象类

写一个父类抽象类

  1. public abstract class Handler {
  2. /**
  3. * 下一个审批者 让子类可以获取
  4. */
  5. protected Handler nextHandler;
  6. /**
  7. * 设置下一个批准者
  8. *
  9. * @param nextHandler 下一个批准者
  10. * @author YangYudi
  11. * @date 2020/12/11 17:25
  12. */
  13. public void setNextHandler(Handler nextHandler) {
  14. this.nextHandler = nextHandler;
  15. }
  16. /**
  17. * 审批方法 由子类实现
  18. *
  19. * @param course 审批的课程
  20. */
  21. public abstract void deploy(Course course);
  22. }

具体审批类

手记审批类,判断手记是否为空,空就打回

  1. public class ArticleHandler extends Handler {
  2. @Override
  3. public void deploy(Course course) {
  4. if (StringUtils.isNoneEmpty(course.getArticle())) {
  5. System.out.println(course.getName() + "手记不为空,批准");
  6. if (nextHandler != null) {
  7. //交给下一个审批者
  8. nextHandler.deploy(course);
  9. }
  10. } else {
  11. System.out.println(course.getName() + "手记为空,不批准,流程结束");
  12. }
  13. }
  14. }

视频审批类,判断视频是否为空,空就打回

  1. public class VideoHandler extends Handler {
  2. @Override
  3. public void deploy(Course course) {
  4. if (StringUtils.isNoneEmpty(course.getVideo())) {
  5. System.out.println(course.getName() + "视频不为空,批准");
  6. if (nextHandler != null) {
  7. //交给下一个审批者
  8. nextHandler.deploy(course);
  9. }
  10. } else {
  11. System.out.println(course.getName() + "视频为空,不批准,流程结束");
  12. }
  13. }
  14. }

应用

  1. public static void main(String[] args) {
  2. ArticleHandler articleHandler = new ArticleHandler();
  3. VideoHandler videoHandler = new VideoHandler();
  4. Course course = new Course()
  5. .setName("123课程")
  6. // .setArticle("123123321")
  7. .setVideo("12321331212");
  8. //设置下一级审批者
  9. articleHandler.setNextHandler(videoHandler);
  10. articleHandler.deploy(course);
  11. }

故意在此设手记为空 这样到了审批手记的流程就会打回

image.png
将手记注解打开,流程全都通过了
image.png

思考

责任链模式和策略模式略有相似
策略模式在于选择策略
责任链只需要知道第一个调用者就行了,他就会一路追踪