炫技亮点 优雅处理数据流程 过滤器模式

  • 过滤器模式定义: 过滤器模式是一种行为设计模式,用于通过一系列过滤器对数据流进行处理、过滤或转换。这种模式通过将处理逻辑拆分各个独立的过滤器组件,使得每个过滤器可以独立地处理特定的任务,同时又能够以灵活的方式组合这些过滤器来构建不同的处理流程。
  • 灵活性和可组合性: 过滤器模式提供了灵活性和可组合性。通过添加、删除或重新组合过滤器,可以轻松地修改处理流程而无需修改已有的代码。这种灵活性使得过滤器模式适用于需要动态调整处理流程的场景。
  • 流程控制: 过滤器的每一层都具有决策权可以决定是否处理当前层的逻辑以及是否将数据继续传递给下一层。这种流程控制的机制使得过滤器模式适用于处理复杂的业务逻辑,其中不同步骤的执行可能受到特定条件的影响。
  • 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());
    }
}

Filter1Filter2是具体的过滤器,它们分别对请求和响应对象进行处理。

FilterChain负责管理过滤器的执行顺序。通过组合不同的过滤器,可以实现不同的数据处理逻辑。

总结

当存在如下情况考虑使用过滤器模式:

  1. 复杂的数据处理: 当你有一个包含大量数据或对象的集合,需要根据不同的条件进行过滤、排序或处理时,过滤器模式能够提供一种清晰的组织结构,让你能够轻松地添加、移除或修改过滤规则。
  2. 责任链需求: 如果你希望将处理流程拆分为一系列独立的组件,每个组件负责特定的处理逻辑,并且这些组件可以按照一定的顺序组成责任链,那么过滤器模式是一个不错的选择。
  3. 动态处理流程: 当你需要在运行时动态地改变处理流程,可能是添加新的处理步骤或删除某些步骤,过滤器模式能够灵活地应对这种变化。
  4. 可复用性和可扩展性: 如果你希望编写可复用的、独立的组件,这些组件可以在不同的场景下被组合使用,过滤器模式提供了一种松散耦合的设计,使得组件更容易被复用和扩展。
  5. 多个步骤的处理: 当你的处理流程包含多个步骤,每个步骤可以由不同的处理器来完成,过滤器模式可以帮助你清晰地划分这些步骤,使得代码更加模块化。
  6. 条件化处理: 如果你的应用需要根据一些条件选择性地应用某些处理逻辑,过滤器模式提供了一种优雅的方式来处理这种条件化的逻辑。

参考

  • https://www.baeldung.com/intercepting-filter-pattern-in-java

相关推荐

  1. 优雅处理数据流程 过滤器模式

    2024-02-22 03:04:03       29 阅读
  2. 【Python】如何突破网站识别爬取功能?

    2024-02-22 03:04:03       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-22 03:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-22 03:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-22 03:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-22 03:04:03       18 阅读

热门阅读

  1. 类和对象 下(再谈构造函数 static成员 友元)

    2024-02-22 03:04:03       32 阅读
  2. 【Linux 内核源码分析】内存管理——Slab 分配器

    2024-02-22 03:04:03       29 阅读
  3. C++面试高频问题汇总( 一)

    2024-02-22 03:04:03       36 阅读
  4. gtowizard合租cash和锦标赛mtt

    2024-02-22 03:04:03       26 阅读
  5. 前端常见面试题

    2024-02-22 03:04:03       26 阅读
  6. Qt 基本知识

    2024-02-22 03:04:03       28 阅读
  7. webrtc 中 FIR PLI 有何区别? 分别适用于什么场景

    2024-02-22 03:04:03       32 阅读
  8. vue 学习definproperty方法

    2024-02-22 03:04:03       32 阅读
  9. Gradio学习(二)—————学习block布局

    2024-02-22 03:04:03       27 阅读
  10. SpringBoot-将Bean放入容器的五种方式

    2024-02-22 03:04:03       30 阅读
  11. Sora 使用教程,新手小白可用

    2024-02-22 03:04:03       40 阅读
  12. win32 汇编调用C标准库函数

    2024-02-22 03:04:03       30 阅读
  13. SpringBoot+WebSocket实现即时通讯(一)

    2024-02-22 03:04:03       29 阅读
  14. 触发器的类型有哪些?

    2024-02-22 03:04:03       26 阅读
  15. 使用 Spring Authorization Server

    2024-02-22 03:04:03       31 阅读
  16. 计算机软件学习大方向

    2024-02-22 03:04:03       30 阅读
  17. 19 OpenGL计算着色器

    2024-02-22 03:04:03       25 阅读