- 过滤器模式定义: 过滤器模式是一种行为设计模式,用于通过一系列过滤器对数据流进行处理、过滤或转换。这种模式通过将处理逻辑拆分成各个独立的过滤器组件,使得每个过滤器可以独立地处理特定的任务,同时又能够以灵活的方式组合这些过滤器来构建不同的处理流程。
- 灵活性和可组合性: 过滤器模式提供了灵活性和可组合性。通过添加、删除或重新组合过滤器,可以轻松地修改处理流程,而无需修改已有的代码。这种灵活性使得过滤器模式适用于需要动态调整处理流程的场景。
- 流程控制: 过滤器的每一层都具有决策权,可以决定是否处理当前层的逻辑,以及是否将数据继续传递给下一层。这种流程控制的机制使得过滤器模式适用于处理复杂的业务逻辑,其中不同步骤的执行可能受到特定条件的影响。
- Web拦截过滤器应用场景: 在Web开发中,拦截过滤器常用于实现身份验证、日志记录和访问控制等功能。例如,可以通过配置拦截器来确保用户在访问某些资源之前经过身份验证,或者记录每个请求的详细信息以进行分析和监控。
- 实现松散耦合: 过滤器模式通过实现松散耦合的设计,使得每个过滤器都独立于其他过滤器。这种独立性使得过滤器易于测试、维护和扩展。
请求和响应
也可以使用泛型
public class Request {
private String content;
public Request(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
public class Response {
private String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
过滤器接口和实现
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
// 具体过滤器1
public class Filter1 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("Filter1 request");
request.setContent(request.getContent() + " -> Filter1");
chain.doFilter(request, response);
response.setContent(response.getContent() + " -> Filter1");
System.out.println("Filter1 response");
}
}
// 具体过滤器2
public class Filter2 implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.setContent(request.getContent() + " -> Filter2");
chain.doFilter(request, response);
response.setContent(response.getContent() + " -> Filter2");
}
}
过滤器链
注意FilterChain不是线程安全的,应该是每个任务或者请求单独一个链。
public class FilterChain {
private List<Filter> filters = new ArrayList<>();
private int index = 0;
public void addFilter(Filter filter) {
filters.add(filter);
}
public void doFilter(Request request, Response response) {
if (index < filters.size()) {
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, this);
}
}
}
过滤器链工厂
public class FilterFactory {
public static FilterChain createFilterChain(){
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new Filter1());
filterChain.addFilter(new Filter2());
return filterChain;
}
}
示例
public class Main {
public static void main(String[] args) {
// 创建过滤器链 每个任务或者请求一个单独的FilterChain
FilterChain filterChain = FilterFactory.createFilterChain();
// 创建请求和响应对象
Request request = new Request("Original Data");
Response response = new Response();
// 执行过滤器链
filterChain.doFilter(request, response);
// 输出结果
System.out.println("Final request content: " + request.getContent());
System.out.println("Final response content: " + response.getContent());
}
}
Filter1
和Filter2
是具体的过滤器,它们分别对请求和响应对象进行处理。
FilterChain
负责管理过滤器的执行顺序。通过组合不同的过滤器,可以实现不同的数据处理逻辑。
总结
当存在如下情况考虑使用过滤器模式:
- 复杂的数据处理: 当你有一个包含大量数据或对象的集合,需要根据不同的条件进行过滤、排序或处理时,过滤器模式能够提供一种清晰的组织结构,让你能够轻松地添加、移除或修改过滤规则。
- 责任链需求: 如果你希望将处理流程拆分为一系列独立的组件,每个组件负责特定的处理逻辑,并且这些组件可以按照一定的顺序组成责任链,那么过滤器模式是一个不错的选择。
- 动态处理流程: 当你需要在运行时动态地改变处理流程,可能是添加新的处理步骤或删除某些步骤,过滤器模式能够灵活地应对这种变化。
- 可复用性和可扩展性: 如果你希望编写可复用的、独立的组件,这些组件可以在不同的场景下被组合使用,过滤器模式提供了一种松散耦合的设计,使得组件更容易被复用和扩展。
- 多个步骤的处理: 当你的处理流程包含多个步骤,每个步骤可以由不同的处理器来完成,过滤器模式可以帮助你清晰地划分这些步骤,使得代码更加模块化。
- 条件化处理: 如果你的应用需要根据一些条件选择性地应用某些处理逻辑,过滤器模式提供了一种优雅的方式来处理这种条件化的逻辑。
参考:
- https://www.baeldung.com/intercepting-filter-pattern-in-java
文章评论