• 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的使用。娘的,真厉害。

  • 相关阅读:
    软件工程课程总结
    c++第五次作业
    软件工程第四次作业
    c++第四次作业
    软件工程第三次作业
    c++第三次作业
    软件工程基础第二次作业
    c++第二次作业
    c++第一次作业
    软件工程基础第一次作业
  • 原文地址:https://www.cnblogs.com/dousil/p/12895790.html
Copyright © 2020-2023  润新知