过滤链可以对对象进行一系列的步骤处理/过滤,把处理的步骤解耦一个个小的部分,
主要有三个角色,
1.抽象的过滤类,负责定义过滤器的实现接口,具体的实现还要具体过滤器角色去参与。
2.具体的过滤类,负责具体筛选规则的逻辑实现,最后再返回被处理的对象
3.被处理的对象, 具体过滤器角色中可以对指定感兴趣的目标进行处理,也可以统一处理
抽象的过滤方法
@FunctionalInterface
public interface Handle {
/**
* 过滤的抽象方法
*/
String handle(String source);
}
具体的过滤器
public class LowerCaseHandle implements Handle {
@Override
public String handle(String source) {
return source.toLowerCase();
}
}
public class ReplaceAllHandle implements Handle {
private String regex;
private String target;
public ReplaceAllHandle(String regex, String target) {
this.regex = regex;
this.target = target;
}
@Override
public String handle(String source) {
return source.replaceAll(regex, target);
}
}
public class UpperCaseHandle implements Handle {
@Override
public String handle(String source) {
return source.toUpperCase();
}
}
过滤链
public class InChainHandle implements Handle {
private final List<Handle> handleList=new ArrayList<>();
public InChainHandle addHandler(Handle handle){
this.handleList.add(handle);
return this;
}
@Override
public String handle(String source) {
for (Handle handle : handleList) {
source=handle.handle(source);
}
return source;
}
public static void main(String[] args) {
InChainHandle chainHandle=new InChainHandle()
.addHandler(new LowerCaseHandle())
.addHandler(new ReplaceAllHandle("fuck","love"))
.addHandler(new UpperCaseHandle());
;
String res = chainHandle.handle("fuck This worLd");
System.out.println(res);
}
}
过滤链的好处就是把过滤的功能解耦成一个个小的过滤器,通过组合的形式来确定处理的流程,这种设计模式在mybatis(拦截器链)、netty(channalHandler)、tomcat(filter)等等均有体现。