作用
一个请求的处理需要多个对象当中的一个或多个协作处理
为请求创建一个接受此请求对象的链,随着链子逐步执行
业务场景:
一个课程发布需要层层审批,所以审批都通过了才可以发布
使用责任链模式来解耦合,让每个审批类各司其职
demo就以审批课程为例
用来被审批的实体类
被用来审批的课程类
@Data@Accessors(chain = true)public class Course {/*** 课程名*/private String name;/*** 手记*/private String article;/*** 视频*/private String video;}
审批抽象类
写一个父类抽象类
public abstract class Handler {/*** 下一个审批者 让子类可以获取*/protected Handler nextHandler;/*** 设置下一个批准者** @param nextHandler 下一个批准者* @author YangYudi* @date 2020/12/11 17:25*/public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}/*** 审批方法 由子类实现** @param course 审批的课程*/public abstract void deploy(Course course);}
具体审批类
手记审批类,判断手记是否为空,空就打回
public class ArticleHandler extends Handler {@Overridepublic void deploy(Course course) {if (StringUtils.isNoneEmpty(course.getArticle())) {System.out.println(course.getName() + "手记不为空,批准");if (nextHandler != null) {//交给下一个审批者nextHandler.deploy(course);}} else {System.out.println(course.getName() + "手记为空,不批准,流程结束");}}}
视频审批类,判断视频是否为空,空就打回
public class VideoHandler extends Handler {@Overridepublic void deploy(Course course) {if (StringUtils.isNoneEmpty(course.getVideo())) {System.out.println(course.getName() + "视频不为空,批准");if (nextHandler != null) {//交给下一个审批者nextHandler.deploy(course);}} else {System.out.println(course.getName() + "视频为空,不批准,流程结束");}}}
应用
public static void main(String[] args) {ArticleHandler articleHandler = new ArticleHandler();VideoHandler videoHandler = new VideoHandler();Course course = new Course().setName("123课程")// .setArticle("123123321").setVideo("12321331212");//设置下一级审批者articleHandler.setNextHandler(videoHandler);articleHandler.deploy(course);}
故意在此设手记为空 这样到了审批手记的流程就会打回
思考
责任链模式和策略模式略有相似
策略模式在于选择策略
责任链只需要知道第一个调用者就行了,他就会一路追踪

