责任链模式

This commit is contained in:
2020-07-22 10:12:44 +08:00
parent eb1c68fd7e
commit 396e40ced6
5 changed files with 135 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 模拟二级审批场景
* <p>
* 审批抽象
* <p>
* java 过滤器实现 {@link javax.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)}
* 实现 {@link FilterChain#doFilter(ServletRequest, ServletResponse)} 接口的组成一条过滤器链
* 所有子类通过调用 chain.doFilter(request, response) 实现链式传递
* <p>
* SpringSecurity过滤器链实现也类似
*
* @author F嘉阳
* @date 2020/7/21 16:59
*/
public abstract class Approver {
/**
* 责任链核心:包含与自身相同的类型对象
*/
protected Approver approver;
/**
* 设置下一个节点,组成链条
*
* @param approver
*/
public void setNextApprover(Approver approver) {
this.approver = approver;
}
/**
* 交由子类实现
*
* @param course
*/
public abstract void deploy(Course course);
}

View File

@@ -0,0 +1,26 @@
package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility;
import org.apache.commons.lang3.StringUtils;
/**
* 手记审批
*
* @author F嘉阳
* @date 2020/7/21 16:59
*/
public class ArticleApprover extends Approver {
@Override
public void deploy(Course course) {
if (StringUtils.isNotEmpty(course.getArticle())) {
System.out.println(course.getName() + "含有手记,批准");
// 是否为末尾
if (approver != null) {
// 执行下一个处理链
approver.deploy(course);
}
} else {
System.out.println(course.getName() + "不含有手记,不批准,流程结束");
return;
}
}
}

View File

@@ -0,0 +1,18 @@
package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility;
import lombok.Data;
/**
* 课程
*
* @author F嘉阳
* @date 2020/7/21 16:59
*/
@Data
public class Course {
private String name;
private String article;
private String video;
}

View File

@@ -0,0 +1,24 @@
package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility;
import org.apache.commons.lang3.StringUtils;
/**
* 视频审批
*
* @author F嘉阳
* @date 2020/7/21 16:59
*/
public class VideoApprover extends Approver {
@Override
public void deploy(Course course) {
if (StringUtils.isNotEmpty(course.getVideo())) {
System.out.println(course.getName() + "含有视频,批准");
if (approver != null) {
approver.deploy(course);
}
} else {
System.out.println(course.getName() + "不含有视频,不批准,流程结束");
return;
}
}
}

View File

@@ -0,0 +1,25 @@
package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility;
import org.junit.jupiter.api.Test;
/**
* @author F嘉阳
* @date 2020/7/21 15:06
*/
class ChainofResponsibilityTest {
@Test
void doTest() {
Approver articleApprover = new ArticleApprover();
Approver videoApprover = new VideoApprover();
Course course = new Course();
course.setName("Java设计模式");
course.setArticle("Java设计模式的手记");
course.setVideo("Java设计模式的视频");
articleApprover.setNextApprover(videoApprover);
articleApprover.deploy(course);
}
}