Filter-Chain模式简介

Filter-Chain模式简介

定义Filter接口

public interface Filter {
    void doFilter(MyRequest request,MyResponse response,FilterChain chain);
 
}

其中MyRequest,MyResponse 是自定义的类型,模拟请求过程,当然MyRequest,MyResponse可以被替换成任意一种类型

public class MyRequest {
    StringBuffer content;
    
    public MyRequest() {
        content = new StringBuffer("request");
    }
    
    public MyRequest(String content){
        this.content = new StringBuffer(content);
    }
 
    public StringBuffer getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = new StringBuffer(content);
    }
    
    public void append(String append){
        this.content.append(append);
    }
}
public class MyResponse {
    private StringBuffer content;
    
    public MyResponse() {
        content = new StringBuffer("response");
    }
    
    public MyResponse(String content){
        this.content = new StringBuffer(content);
    }
 
    public StringBuffer getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = new StringBuffer(content);
    }
    
    public void append(String append){
        this.content.append(append);
    }
    
}

实现Filter接口

每一个具体的Filter实现Filter接口钟定义的doFilter方法,并在方法体钟封装处理逻辑。

第一个具体的Filter类,这里完全简化处理逻辑,需要根据具体场景定义处理逻辑,时间类处理完自身职责逻辑后,将对象传递给FilterChain,调用FilterChain的doFilter方法,FilterChain做为中间对象传递给下一个Filter,稍后我们来看FilterChain这个类的实现

public class FirstFilter implements Filter{
 
    @Override
    public void doFilter(MyRequest request, MyResponse response, FilterChain chain) {
        request.append(" firsrt Filter || ");
        chain.doFilter(request, response);
        response.append(" firsrt Filter || ");
    }
 }

第二个具体Filter类

public class SecondFilter implements Filter{
 
    @Override
    public void doFilter(MyRequest request, MyResponse response, FilterChain chain) {
        request.append("second filter || ");
        chain.doFilter(request, response);
        response.append("second filter || ");
    }
 }

FilterChain的实现

filterchain持有一个List<Filter>的引用,并通过post标志位标记执行到哪一位的Filter,Chain的DoFileter.doFilter方法实际就是将对象传递给Filter,

public class FilterChain{
    private List<Filter> filters;
    int pos = 0;
    
    public FilterChain() {
        filters = new LinkedList<>();
    }
    
    public void addFilter(Filter filter){
        filters.add(filter);
    }
 
    public void doFilter(MyRequest request, MyResponse response) {
        if(pos < filters.size()){
            filters.get(pos++).doFilter(request, response, this);
        }
        
    }
 
}

上诉的实现方式是Tomcat,Spring,中的实现方式,当然更见单的实现方式是每个filter持有下一个filter的引用,处理完成之后,直接调用nextFilter的方法。直到执行完毕。显然第二种在编码上更简单也更容易,那么为什么许多java框架都使用第一种框架而不是使用第二种框架?个人认为i显然在可扩展上要比低一种方式根号。FilterChain 持有Filter列表的管理和控制,这样就filter-chain链的管理集中的地方,实现了维护和扩展方便。

 

 

 

Tomcat仅仅是在反射的基础之上加上了Filter的使用。娘的,真厉害。

 

posted @ 2020-05-15 16:40  dousil  阅读(3053)  评论(0编辑  收藏  举报