责任链概念:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
项目中实际应用场景:当一条数据需要经过不同接口进行处理,利用责任链模式可进行解耦灵活添加不同接口。
例如 oa中请假 张三请假天数不同需要经过不同领导审批。
下面以一张考卷添加不同类型试题为demo来展示责任链模式
main方法
```java
package bjsxt.dp.paper;
import java.util.ArrayList;
import java.util.List;
/**
* @author hwp
* @PACKAGE_NAME: bjsxt.dp.paper
* @company:小清新
* @USER:小清新
* @date: 2021年03月19日 13:32
* @PROJECT_NAME: test
**/
public class TestPaper {
/**
* 生成试卷将不同试题插入数据库
* */
public static void main(String[] args) {
String [] problemList={"单选","多选","简答"};
for (String questionType:problemList) {
PaperFilter pf=new PaperFilter();
FilterChain fc=new FilterChain();
fc.addFilter(new CheckBoxFilter());
fc.addFilter(new AnswerFilter());
fc.addFilter(new SingleChoiceFilter());
pf.setQuestionType(questionType);
pf.setFilterChain(fc);
pf.fillPaper();
}
}
}
实体类
package bjsxt.dp.paper;
import lombok.Data;
/**
* @author hwp
* @PACKAGE_NAME: bjsxt.dp.paper
* @company:小清新
* @USER:小清新
* @date: 2021年03月19日 13:37
* @PROJECT_NAME: test
**/
@Data
public class PaperFilter {
private String questionType;
FilterChain filterChain;
public void fillPaper(){
filterChain.doFilter(questionType);
}
}
进入责任链接口(也可理解为责任链容器)
package bjsxt.dp.paper;
/**
* @author hwp
*/
public interface Filter {
/***
*传入问题类型 进入责任链
*@param questionType
*@return: void
*@author: 小清新
*@Date: 2021/3/19
**/
void doFilter(String questionType);
}
FilterChain接口用来动态添加规则
package bjsxt.dp.paper;
import java.util.ArrayList;
import java.util.List;
/**
* @author hwp
* @PACKAGE_NAME: bjsxt.dp.paper
* @company:小清新
* @USER:小清新
* @date: 2021年03月19日 13:49
* @PROJECT_NAME: test
**/
public class FilterChain implements Filter{
List<Filter> filterList=new ArrayList<Filter>();
public List<Filter> addFilter(Filter filter){
this.filterList.add(filter);
return filterList;
}
@Override
public void doFilter(String questionType) {
for (Filter ft:filterList) {
ft.doFilter(questionType);
}
}
}
规则接口一
package bjsxt.dp.paper;
/**
* @author hwp
* @PACKAGE_NAME: bjsxt.dp.paper
* @company:小清新
* @USER:小清新
* @date: 2021年03月19日 14:32
* @PROJECT_NAME: test
**/
public class AnswerFilter implements Filter{
@Override
public void doFilter(String questionType) {
if(questionType.equals("多选")){
System.out.println("添加简单题");
}
}
}
规则接口二
package bjsxt.dp.paper;
/**
* @author hwp
* @PACKAGE_NAME: bjsxt.dp.paper
* @company:小清新
* @USER:小清新
* @date: 2021年03月19日 14:01
* @PROJECT_NAME: test
**/
public class CheckBoxFilter implements Filter{
@Override
public void doFilter(String questionType) {
if(questionType.equals("多选")){
System.out.println("添加多选题");
}
}
}
责任链模式核心概念为多个实现类实现同一个接口
git地址:
https://github.com/hewenping/Filter