作用
一个请求的处理需要多个对象当中的一个或多个协作处理
为请求创建一个接受此请求对象的链,随着链子逐步执行
业务场景:
一个课程发布需要层层审批,所以审批都通过了才可以发布
使用责任链模式来解耦合,让每个审批类各司其职
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 {
@Override
public 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 {
@Override
public 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);
}
故意在此设手记为空 这样到了审批手记的流程就会打回
思考
责任链模式和策略模式略有相似
策略模式在于选择策略
责任链只需要知道第一个调用者就行了,他就会一路追踪