过滤器模式

过滤器模式(Intercepting Filter Pattern)是一种对象结构型模式,用于统一处理客户端请求,通过过滤器链来执行任务。它包括目标对象、过滤器、过滤器链和过滤管理器等角色。常见应用场景如WEB请求的授权和规范检查。使用过滤器模式可以避免在代码中编写大量if-else逻辑,提高代码的可维护性和复用性。在实际开发中,如Tomcat的Filter和Druid的数据统计Filter都是其典型应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

过滤器模式(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请求】

源码

Click here


总结

过滤器模式将多个互不耦合的标准组成连接成一个标准。若不使用过滤器模式,我们如果需要根据不同场景将数据根据不同条件去过滤,那么我们需要在一个类中编写一大串的if-else 代码,而且不同场景的逻辑代码耦合在同一个类中,不利于代码维护,以及代码复用。


很多框架用到过滤器模式,如tomcat的Filter,Druid数据统计的Filter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值