zoukankan      html  css  js  c++  java
  • 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的使用。娘的,真厉害。

  • 相关阅读:
    2016年回家的大概经过
    [转载][记录]shell 批量修改文件名
    Tinymce4 中Ajax多次加载时,会出现菜单在第二次进入时,显示的下拉菜单在左上角
    PHP生成HTML页面顶部出现空白部分(&#65279字符?)
    tcpdf MultiCell line break
    [转载][记录]javascript生成不重复的随机数
    [转载]PHP 字符串替换中文
    PHP 使用get_class_methods()和array_diff() 兩個相同的類中方法差集
    mysql datetime 排序
    highcharts 去掉右下角链接
  • 原文地址:https://www.cnblogs.com/dousil/p/12895790.html
Copyright © 2011-2022 走看看