过滤器模式
描述
拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
实质(参考过滤器链工作):
原始数据->过滤器1->过滤器2->过滤器3->最终需要的数据
场景
此篇我们以垃圾回收回收为例来描述这一模式
我们需要在一堆垃圾中 选出各种各样的垃圾 来进行分类 然后再过滤出来不是垃圾被回收掉的东西
UML类图
编码
定义垃圾的属性(拦截器)
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Rubbish {
private String name;
private boolean isA;
private boolean isB;
private boolean isC;
}
创建一个检查垃圾的接口(拦截器)
public interface CheckRubbish {
public List<Rubbish> check(List<Rubbish> list);
}
编写有哪几种垃圾(几种拦截器)
public class A implements CheckRubbish {
@Override
public List<Rubbish> check(List<Rubbish> list) {
List<Rubbish> A_list = new ArrayList<>();
list.forEach(item -> {
if (item.isA()) {
A_list.add(item);
}
});
return A_list;
}
}
public class B implements CheckRubbish {
@Override
public List<Rubbish> check(List<Rubbish> list) {
List<Rubbish> B_List = new ArrayList<>();
list.forEach(item -> {
if (item.isB()) {
B_List.add(item);
}
});
return B_List;
}
}
public class C implements CheckRubbish {
@Override
public List<Rubbish> check(List<Rubbish> list) {
List<Rubbish> C_List = new ArrayList<>();
list.forEach(item -> {
if (item.isC()) {
C_List.add(item);
}
});
return C_List;
}
}
测试 : 我们创建一个list(垃圾堆) 用来进行垃圾过滤
public class Test {
public static void main(String[] args) {
List<Rubbish> list = new ArrayList<>();
list.add(new Rubbish("过期香蕉", true, false, false));
list.add(new Rubbish("过期牛奶", false, false, true));
list.add(new Rubbish("过期纸巾", false, true, false));
list.add(new Rubbish("正常牛奶", false, false, false));
A a = new A();
B b = new B();
C c = new C();
System.out.println("A 垃圾");
printRubbish(a.check(list));
System.out.println("B 垃圾");
printRubbish(b.check(list));
System.out.println("C 垃圾");
printRubbish(c.check(list));
}
private static void printRubbish(List<Rubbish> list){
list.forEach(System.out::println);
}
}
垃圾分类:
A 垃圾
Rubbish(name=过期香蕉, isA=true, isB=false, isC=false)
B 垃圾
Rubbish(name=过期纸巾, isA=false, isB=true, isC=false)
C 垃圾
Rubbish(name=过期牛奶, isA=false, isB=false, isC=true)
过滤出来的不是垃圾的:
list.add(new Rubbish("正常牛奶", false, false, false));