责任链模式
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user