一、责任链模式介绍
二、代码演示
三、jdk中使用责任链 模式的地方
一、 责任链模式介绍
定义:为请求创建一个接收此次请求对象的链
类型:行为型
适用场景:
一个请求的处理需要多个对象当中的一个或几个协作处理
优点:
请求的发送者和接收者(请求处理)解耦
责任链可以动态组合
缺点:
责任链太长或者处理时间过长,影响性能
责任链有可能过多
相关设计模式:
责任链模式和状态模式
二、代码演示
//课程类
public class Course {
private String name;
private String article;
private String video;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public String getVideo() {
return video;
}
public void setVideo(String video) {
this.video = video;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", article='" + article + '\'' +
", video='" + video + '\'' +
'}';
}
}
/**
* @program: adpn-pattern->Handler
* @description: 责任链批准者
* @author: Jstar
* @create: 2019-12-01 20:32
**/
public abstract class Handler {
protected Handler handler;
public void setNextHandler(Handler handler){
this.handler=handler;
}
public abstract void deployment(Course course);
}
//手记批准者
public class ArtileHandler extends Handler{
@Override
public void deployment(Course course) {
if(StringUtils.isNotBlank(course.getArticle())){
System.out.println(course.getName()+" 含有手记");
if(handler!=null){
handler.deployment(course);
}
}else{
System.out.println(course.getName()+ "不含有手记,不批准");
return;
}
}
}
//视频批准者
public class VideoHandler extends Handler{
@Override
public void deployment(Course course) {
if(StringUtils.isNotBlank(course.getVideo())){
System.out.println(course.getName()+" 含有视频");
if(handler!=null){
handler.deployment(course);
}
}else{
System.out.println(course.getName()+ "不含有视频,不批准");
return;
}
}
}
//测试类
public class Test {
public static void main(String[] args) {
Handler articleHandler=new ArtileHandler();
Handler videoHandler = new VideoHandler();
articleHandler.setNextHandler(videoHandler);
Course course = new Course();
course.setName("课程名称");
course.setArticle("手记");
course.setVideo("视频");
articleHandler.deployment(course);
}
}
看一下类的uml图:
测试结果:
三、jdk中使用 责任链模式的地方器模式
1、javax.servlet.Filter
doFilter() 方法的实现是责任链模式: