拦截过滤器(Intercepting Filter)模式是一种用于对应用程序请求和响应进行处理的设计模式。它允许在请求处理过程中动态添加、修改或删除过滤器来实现一些通用的功能,例如日志记录、身份验证、授权等。

拦截过滤器模式的主要组件包括:

1. 过滤器接口(Filter): 定义了过滤器的接口,包括 doFilter 方法,该方法用于执行实际的过滤逻辑。
public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

2. 过滤器实现类(Concrete Filter): 实现了过滤器接口,提供了具体的过滤逻辑。
public class AuthenticationFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        // 执行身份验证逻辑
        System.out.println("AuthenticationFilter: Authenticating request");
        chain.doFilter(request, response);
    }
}

public class LoggingFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        // 记录日志
        System.out.println("LoggingFilter: Logging request");
        chain.doFilter(request, response);
    }
}

3. 过滤器链(Filter Chain): 用于管理一组过滤器,并在请求处理过程中依次调用它们。
public class FilterChain {
    private List<Filter> filters = new ArrayList<>();
    private Target target;

    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    public void setTarget(Target target) {
        this.target = target;
    }

    public void execute(Request request, Response response) {
        for (Filter filter : filters) {
            filter.doFilter(request, response, this);
        }
        target.execute(request, response);
    }
}

4. 目标对象(Target): 提供了实际的业务逻辑,被过滤器链调用。
public class Target {
    public void execute(Request request, Response response) {
        // 执行业务逻辑
        System.out.println("Executing target request");
    }
}

5. 客户端(Client): 创建过滤器链,并设置目标对象,发起请求。
public class Client {
    public static void main(String[] args) {
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new AuthenticationFilter());
        filterChain.addFilter(new LoggingFilter());

        Target target = new Target();
        filterChain.setTarget(target);

        Request request = new Request();
        Response response = new Response();

        filterChain.execute(request, response);
    }
}

在这个例子中,Filter 接口定义了过滤器的接口,而 AuthenticationFilter 和 LoggingFilter 是两个具体的过滤器实现。FilterChain 是过滤器链,用于管理过滤器并在请求处理过程中调用它们。Target 是目标对象,提供了实际的业务逻辑。客户端通过创建过滤器链、添加过滤器、设置目标对象,并调用 execute 方法来发起请求。

拦截过滤器模式的优势在于它提供了一种灵活的方式来实现可重用的、可组合的过滤逻辑。通过动态添加、删除或修改过滤器,可以轻松实现不同的功能组合。这种模式常用于 Web 应用程序的请求处理中。


转载请注明出处:http://www.zyzy.cn/article/detail/13967/设计模式