责任链模式
Posted 一条coding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了责任链模式相关的知识,希望对你有一定的参考价值。
哈喽,大家好,我是一条。
今天想和大家聊一下责任链模式,在源码中经常看到,应用非常广泛,属于行为型设计模式。
还是老规则哈,建一个maven
工程,并安装lombok
依赖和插件。
定义
官方版
责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
说人话
首先一个重点是链,可以类比成链表。
那么链表里面放什么呢?放一个个处理器(Handler)。
与审批流程非常相似,当发起一个请求时,需要层层审批(处理),而审批的发起者,并不关心这其中的过程,只想知道结果,就需要将请求者和处理者解耦。
Coding
情景再现
假设我制作了一门课程需要发布到某平台,那首先需要经过审核人员的处理,比如需要对标题、内容、视频等做审核。
下面就用代码模拟这个流程。
新建课程类
/**
* 课程
*/
@Data // lombok注解
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)
// client
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。
以上是关于责任链模式的主要内容,如果未能解决你的问题,请参考以下文章