定义
过滤器模式(Intercepting Filter Pattern),又称标准模式(Criteria Pattern),主要用于统一接收并过滤客户端的请求,根据过滤器的选择,将请求传送给对应的目标处理程序。
过滤器模式属于对象结构型模式。
要点
主要角色:
目标对象(Target):处理请求,根据要求执行任务。
过滤器(Filter):过滤器在请求处理程序执行请求之前或之后,执行某些任务。
过滤器链(Filter Chain):过滤器链带有多个过滤器,并在 Target 之前按照定义的顺序执行这些过滤器。
过滤管理器(Filter Manager):过滤管理器管理过滤器和过滤器链。
场景
某应用WEB场景下,一个客户的WEB请求需要经过授权检查和规范检查,符合全部条件时才会处理该客户的请求。
实现
Target
/**
* 目标类
*/
public class Target {
public void processingRequest(String request) {
System.out.println("目标对象处理请求:" + request);
}
}
Filter
/**
* 过滤器接口
*/
public interface Filter {
void execute(String request);
}
AuthenticationFilter
/**
* 过滤器实现类A
*/
public class AuthenticationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("授权检查:" + request);
}
}
SpecificationFilter
/**
* 过滤器实现类B
*/
public class SpecificationFilter implements Filter {
@Override
public void execute(String request) {
System.out.println("规范检查:" + request);
}
}
FilterChain
/**
* 过滤器链
*/
public class FilterChain {
/**
* 过滤器
*/
private List<Filter> filters;
/**
* 目标对象
*/
private Target target;
public FilterChain() {
filters = new ArrayList<>();
}
public void addFilter(Filter filter) {
filters.add(filter);
}
public void setTarget(Target target) {
this.target = target;
}
public void execute(String request) {
// 过滤请求
for (Filter filter : filters) {
filter.execute(request);
}
// 目标对象处理请求
target.processingRequest(request);
}
}
FilterManager
/**
* 过滤器管理
*/
public class FilterManager {
private FilterChain filterChain;
public FilterManager(Target target) {
this.filterChain = new FilterChain();
this.filterChain.setTarget(target);
}
public void addFilter(Filter filter) {
filterChain.addFilter(filter);
}
public void filterRequest(String request) {
filterChain.execute(request);
}
}
Client
public class Client {
public static void main(String[] args) {
sendRequest();
}
private static void sendRequest() {
FilterManager filterManager = new FilterManager(new Target());
filterManager.addFilter(new AuthenticationFilter());
filterManager.addFilter(new SpecificationFilter());
filterManager.filterRequest("【@Request:这里是一个WEB请求】");
}
}
-----------------输出----------------
授权检查:【@Request:这里是一个WEB请求】
规范检查:【@Request:这里是一个WEB请求】
目标对象处理请求:【@Request:这里是一个WEB请求】
源码
总结
过滤器模式将多个互不耦合的标准组成连接成一个标准。若不使用过滤器模式,我们如果需要根据不同场景将数据根据不同条件去过滤,那么我们需要在一个类中编写一大串的if-else 代码,而且不同场景的逻辑代码耦合在同一个类中,不利于代码维护,以及代码复用。
很多框架用到过滤器模式,如tomcat的Filter,Druid数据统计的Filter