MST

星途 面试题库

面试题:Java设计模式之责任链模式在实际项目中的优化

假设在一个Web应用程序中,有一系列的过滤器用于处理用户请求,如身份验证过滤器、权限检查过滤器、日志记录过滤器等。请使用责任链模式进行设计并实现这一功能。在实现过程中,考虑如何优化责任链的性能,避免不必要的链传递,例如当某个过滤器发现请求不符合条件时,如何快速终止后续过滤操作。
12.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 定义过滤器接口

public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

2. 定义FilterChain类

import java.util.ArrayList;
import java.util.List;

public class FilterChain {
    private List<Filter> filters = new ArrayList<>();
    private int index = 0;

    public FilterChain addFilter(Filter filter) {
        filters.add(filter);
        return this;
    }

    public void doFilter(Request request, Response response) {
        if (index < filters.size()) {
            Filter filter = filters.get(index);
            index++;
            filter.doFilter(request, response, this);
        }
    }
}

3. 具体过滤器实现

身份验证过滤器

public class AuthenticationFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        if (isAuthenticated(request)) {
            chain.doFilter(request, response);
        } else {
            response.setMessage("Authentication failed");
        }
    }

    private boolean isAuthenticated(Request request) {
        // 实际的身份验证逻辑
        return request.getCredentials() != null && request.getCredentials().equals("valid");
    }
}

权限检查过滤器

public class AuthorizationFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        if (hasPermission(request)) {
            chain.doFilter(request, response);
        } else {
            response.setMessage("Authorization failed");
        }
    }

    private boolean hasPermission(Request request) {
        // 实际的权限检查逻辑
        return request.getPermissions().contains("requiredPermission");
    }
}

日志记录过滤器

public class LoggingFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("Logging request: " + request.getDetails());
        chain.doFilter(request, response);
        System.out.println("Logging response: " + response.getMessage());
    }
}

4. 定义请求和响应类

public class Request {
    private String credentials;
    private List<String> permissions;
    private String details;

    // getters and setters
    public String getCredentials() {
        return credentials;
    }

    public void setCredentials(String credentials) {
        this.credentials = credentials;
    }

    public List<String> getPermissions() {
        return permissions;
    }

    public void setPermissions(List<String> permissions) {
        this.permissions = permissions;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }
}

public class Response {
    private String message;

    // getters and setters
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

5. 使用示例

public class Main {
    public static void main(String[] args) {
        Request request = new Request();
        request.setCredentials("valid");
        request.setPermissions(List.of("requiredPermission"));
        request.setDetails("Some request details");

        Response response = new Response();

        FilterChain filterChain = new FilterChain()
              .addFilter(new AuthenticationFilter())
              .addFilter(new AuthorizationFilter())
              .addFilter(new LoggingFilter());

        filterChain.doFilter(request, response);
        System.out.println("Final response: " + response.getMessage());
    }
}

性能优化说明

  1. 提前终止:在每个具体过滤器的doFilter方法中,当请求不符合条件时(如身份验证失败、权限不足),直接处理并设置响应信息,不再调用chain.doFilter,从而避免不必要的链传递。
  2. 过滤器顺序优化:将能够快速判断请求是否合法的过滤器(如身份验证过滤器)放在责任链的前面,尽早终止不合法请求的处理,减少后续过滤器的调用开销。

以上是基于Java语言实现的责任链模式处理Web应用程序过滤器的示例,其他编程语言也可以参照类似的设计思路来实现。