diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Approver.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Approver.java new file mode 100644 index 0000000..56e6add --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Approver.java @@ -0,0 +1,42 @@ +package top.fjy8018.designpattern.pattern.behavior.chainofresponsibility; + +import javax.servlet.FilterChain; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * 模拟二级审批场景 + *

+ * 审批抽象 + *

+ * java 过滤器实现 {@link javax.servlet.Filter#doFilter(ServletRequest, ServletResponse, FilterChain)} + * 实现 {@link FilterChain#doFilter(ServletRequest, ServletResponse)} 接口的组成一条过滤器链 + * 所有子类通过调用 chain.doFilter(request, response) 实现链式传递 + *

+ * 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); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ArticleApprover.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ArticleApprover.java new file mode 100644 index 0000000..276efb1 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ArticleApprover.java @@ -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; + } + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Course.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Course.java new file mode 100644 index 0000000..11247dd --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/Course.java @@ -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; +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/VideoApprover.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/VideoApprover.java new file mode 100644 index 0000000..b1d6c1f --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/VideoApprover.java @@ -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; + } + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ChainofResponsibilityTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ChainofResponsibilityTest.java new file mode 100644 index 0000000..ae7b921 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/chainofresponsibility/ChainofResponsibilityTest.java @@ -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); + } +} \ No newline at end of file