「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
一、什么是过滤器模式
过滤器模式或者说标准模式指开发人员通过不同的标准来过滤一组对象。比如进行一个班的数学成绩分析,老师想要考90分以上的试卷。这时候就是在一堆试卷中制定一个标准,获得满足条件的那部分。假设试卷有一个选择题多少分,和大题多少分,老师又想要选择题得分超过40分的试卷,这又是一个标准,再次过滤所有试卷,获得满足条件的那部分。
二、过滤器模式的实现
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExamInfo {
/**
* 总分
*/
private Integer totalScore;
/**
* 选这题
*/
private Integer optionScore;
/**
* 大题
*/
private Integer bigQuestionScore;
}
试卷类,在此类上运用标准。
public interface ScreenStandard {
List<ExamInfo> screenExam(List<ExamInfo> exams);
}
标准接口。
/**
* 总分90以上
*/
public class StandardOne implements ScreenStandard{
@Override
public List<ExamInfo> screenExam(List<ExamInfo> exams) {
List<ExamInfo> result = new ArrayList<>();
for (ExamInfo exam : exams) {
if (exam.getTotalScore()>=90){
result.add(exam);
}
}
return result;
}
}
标准的第一种实现,这里限定试卷总分大于等于90分。
/**
* 选择40分以上
*/
public class StandardTow implements ScreenStandard{
@Override
public List<ExamInfo> screenExam(List<ExamInfo> exams) {
List<ExamInfo> result = new ArrayList<>();
for (ExamInfo exam : exams) {
if (exam.getOptionScore()>=40){
result.add(exam);
}
}
return result;
}
}
标准的第二种实现。
public static void main(String[] args) {
List<ExamInfo> examInfoList = new ArrayList<>();
examInfoList.add(new ExamInfo(10,5,5));
examInfoList.add(new ExamInfo(90,50,40));
examInfoList.add(new ExamInfo(100,50,50));
examInfoList.add(new ExamInfo(80,30,50));
examInfoList.add(new ExamInfo(20,15,5));
ScreenStandard standardOne = new StandardOne();
ScreenStandard standardTow = new StandardTow();
System.out.println("总分大于等于90分");
System.out.println(standardOne.screenExam(examInfoList));
System.out.println("选择题大于等于40分");
System.out.println(standardTow.screenExam(examInfoList));
}
客户端调用。可以看到限定试卷的标准类与试卷本身是分开的,想要使用的时候才会使用标准。
三、总结
过滤器模式的有着简单,解耦,使用方便的优点。在开发中的拦截器,拦截部分请求,放过部分请求,就是过滤器模式的运用了。 如有问题,请大佬指正。