博客
关于我
夜光 带你走进设计模式(三十三)
阅读量:279 次
发布时间:2019-03-01

本文共 2771 字,大约阅读时间需要 9 分钟。

拦截过滤器模式(Intercepting Filter Pattern)是一种常见的设计模式,用于在应用程序的请求或响应处理过程中,对数据进行预处理或后处理。这种模式通过定义过滤器,并在请求传递给实际目标程序之前或之后执行过滤器功能,常见的应用场景包括认证、授权、日志记录等。

模式定义

拦截过滤器模式主要由以下几个核心组成部分组成:

  • 过滤器(Filter)

    过滤器是一个接口或抽象类,定义了一组标准化的方法。通过实现过滤器,可以对请求进行统一处理。例如,AuthenticationFilter 用于身份验证,DebugFilter 用于日志记录。

  • 过滤器链(Filter Chain)

    过滤器链是将多个过滤器按特定顺序组合在一起的逻辑单元。每个过滤器在处理请求时都会依次执行,例如,先执行AuthenticationFilter,再执行DebugFilter

  • 目标(Target)

    目标是请求处理的核心程序,负责最终完成对请求的处理。例如,Target 可能是一个控制器或业务逻辑处理程序。

  • 过滤管理器(Filter Manager)

    过滤管理器负责管理过滤器和过滤器链。它通常包含一个过滤链对象,并提供接口来添加过滤器或设置目标。

  • 客户端(Client)

    客户端是请求处理程序的调用者,通过过滤管理器来执行请求预处理和后处理。

  • 实现步骤

    要实现拦截过滤器模式,可以按照以下步骤进行:

  • 定义过滤器接口

    创建一个Filter接口,定义通用的处理逻辑。例如:

    public interface Filter {    void execute(String request);}
  • 创建实体过滤器

    根据需求实现过滤器接口。例如:

    • AuthenticationFilter 用于身份验证
    • DebugFilter 用于日志记录
  • 创建目标程序

    定义目标程序Target,它负责处理最终的请求。例如:

    public class Target {    public void execute(String request) {        System.out.println("执行请求:" + request);    }}
  • 创建过滤器链

    过滤器链负责管理多个过滤器的执行顺序。例如:

    public class FilterChain {    private List
    filters = new ArrayList<>(); private Target target; public void addFilter(Filter filter) { filters.add(filter); } public void execute(String request) { for (Filter filter : filters) { filter.execute(request); } target.execute(request); } public void setTarget(Target target) { this.target = target; }}
  • 创建过滤管理器

    过滤管理器负责管理过滤器链和目标程序。例如:

    public class FilterManager {    private FilterChain filterChain;    public FilterManager(Target target) {        filterChain = new FilterChain();        filterChain.setTarget(target);    }    public void setFilter(Filter filter) {        filterChain.addFilter(filter);    }    public void filterRequest(String request) {        filterChain.execute(request);    }}
  • 创建客户端

    客户端主要负责调用过滤管理器来处理请求。例如:

    public class Client {    private FilterManager filterManager;    public void setFilterManager(FilterManager filterManager) {        this.filterManager = filterManager;    }    public void sendRequest(String request) {        filterManager.filterRequest(request);    }}
  • 使用客户端演示模式

    通过客户端类InterceptingFilterDemo来演示拦截过滤器模式的使用。例如:

    public class InterceptingFilterDemo {    public static void main(String[] args) {        FilterManager filterManager = new FilterManager(new Target());        filterManager.setFilter(new AuthenticationFilter());        filterManager.setFilter(new DebugFilter());        Client client = new Client();        client.setFilterManager(filterManager);        client.sendRequest("HOME");    }}
  • 示例输出

    执行程序时,输出结果如下:

    Authenticating request: HOMErequest log: HOMEExecuting request: HOME

    优势

    拦截过滤器模式具有以下优势:

  • 灵活性

    可以通过动态添加过滤器来扩展系统功能。

  • 可复用性

    过滤器可以被多个过滤管理器复用,减少代码冗余。

  • 可测试性

    通过单元测试可以分别验证每个过滤器的功能。

  • 可扩展性

    在需要新增功能时,只需添加新的过滤器即可,不影响现有系统。

  • 这种设计模式在Web应用开发中广泛应用,特别是在需要对请求进行多层次校验和记录的场景中。

    转载地址:http://vvbo.baihongyu.com/

    你可能感兴趣的文章
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>