哈喽,大家好,我是一条。
今天想和大家聊一下责任链模式,在源码中经常看到,应用非常广泛,属于行为型设计模式。
还是老规则哈,建一个maven 工程,并安装lombok 依赖和插件。
定义
官方版
责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
说人话
首先一个重点是链,可以类比成链表。
那么链表里面放什么呢?放一个个处理器(Handler)。
与审批流程非常相似,当发起一个请求时,需要层层审批(处理),而审批的发起者,并不关心这其中的过程,只想知道结果,就需要将请求者和处理者解耦。
Coding
情景再现
假设我制作了一门课程需要发布到某平台,那首先需要经过审核人员的处理,比如需要对标题、内容、视频等做审核。
下面就用代码模拟这个流程。
新建课程类
@Data
public class Course {
private String name;
private String article;
private String video;
}
抽象审批者
nextApprove 和链表中的下一个节点异曲同工。
@Data
public abstract class Approve {
protected Approve nextApprove;
public abstract void deploy(Course course);
}
实际审批者
public class ArticleApprove extends Approve{
@Override
public void deploy(Course course) {
}
}
public class NameApprove extends Approve{
@Override
public void deploy(Course course) {
}
}
public class VideoApprove extends Approve{
@Override
public void deploy(Course course) {
}
}
实现处理器方法
@Override
public void deploy(Course course) {
if (course.getVideo()!=null){
System.out.println("video pass!");
// 核心逻辑,调用处理器链的下一个
if (nextApprove != null){
nextApprove.deploy(course);
}
}else {
System.out.println("video fail!");
return;
}
}
测试
public static void main(String[] args) {
Course course = new Course();
course.setVideo("video");
course.setName("name");
ArticleApprove articleApprove = new ArticleApprove();
VideoApprove videoApprove = new VideoApprove();
NameApprove nameApprove = new NameApprove();
nameApprove.setNextApprove(articleApprove);
articleApprove.setNextApprove(videoApprove);
nameApprove.deploy(course);
}
}
类图
源码
- Filter MVC中的Filter相信大家都不陌生。
- Sentinal 核心也是责任链模式。
- 包括Aop也是责任链。
下一期实现完整责任链——Filter。
|