filter过滤器之责任链设计模式

2019-10-04  本文已影响0人  _FireFly_

过滤器链(责任链设计模式)

链表结构
Node类(节点) 每一个对象 管理一个值
0.属性 Node prev (找到上一个责任人在哪里)
1.属性 Object value (存值)
2.属性 Node next (找到下一个责任人在哪里)
过滤器链(责任链设计模式)
Chain of Responsbility Pattern
Filter类 每一个filter对象 管理当前filter做的事情
doFilter方法

这里只是简单的模拟了Tomcat的内部的filter封装,只是思路。

链表结构与责任链模式区别

责任链设置模式,在filter中的体现就是通过ApplicationFilterChain来管理web.xml中配置的所有过滤器,然后通过ApplicationFilterChain来调用每个filter。
首先客户端发出login的请求,然后去找ApplicationFilterChain类,ApplicationFilterChain来决定先调用哪个filter,然后调用了filter执行完doFilter()方法之后,再次由ApplicationFilterChain来决定下次该调用哪个filter,知道没有filter可调用之后,执行完成请求的controller

ApplicationFilterChain.java

管理Tomcat中的所有filter,具体是通过反射解析web.xml文件来创建filter对象并执行对应的doFilter()方法

package myfiterchain;

import java.util.ArrayList;

//这个类是负责将所有filter对象 串联起来的
public class ApplicationFilterChain implements FilterChain {

    //需要一个容器 将所有的filter对象都存起来  集合list set
    private ArrayList<Filter> filterList = new ArrayList();
    //用来记录位置(索引)
    private int index = 0;
    //理论上应该是一个块  加载集合中所有的对象
    //读取文件     获取类名字   反射获取class    反射获取对象  对象存入集合
    //提供一个方法 将反射创建出来的对象存入集合内
    public void addFilter(Filter filter){
        filterList.add(filter);
    }

    //设计一个方法 每一次找寻一个责任人
    public void doFilter(){
        if(index < filterList.size()){
            Filter currentFilter = filterList.get(index++);//找到一个人 按顺序找
            //让当前的责任人做事(回答问题)
            currentFilter.doFilter(this);
        }else{
            //找真正的资源
            //findController();
            System.out.println("该找寻真正资源做事");
        }
    }
}

FIlterChain.java

ApplicationFilterChain类实现的接口,就是doFilter(FilterChain chain)的FilterChain参数,也就是每个filter对象中的doFilter()放行方法

package myfiterchain;

public interface FilterChain {
    void addFilter(Filter filter);
    void doFilter();
}

三个filter类

package myfiterchain;

public class FilterOne extends HttpFilter{

    public void doFilter(FilterChain chain) {
        //做自己的事情
        System.out.println("one回答问题");
        //找管理者 让管理者找下一个人  放行
        chain.doFilter();
    }
}
package myfiterchain;

public class FilterTwo extends HttpFilter {

    public void doFilter(FilterChain chain) {
        System.out.println("two回答问题");
        chain.doFilter();
    }
}
package myfiterchain;

public class FilterThree extends HttpFilter {

    public void doFilter(FilterChain chain) {
        System.out.println("three回答问题");
        chain.doFilter();
    }
}

定义filter接口

package myfiterchain;

public interface Filter {

    void doFilter(FilterChain chain);
}

HttpFilter.java

HttpFilter继承filter接口,将ServletRequest参数和ServletResponse参数强制转换为HttpServletRequest和HttpServletResponse

主方法 进行简单的测试
package myfiterchain;
public class TestMain {
    public static void main(String[] args){
        //1.Tomcat启动
        //2.读取web.xml配置文件
        //      目的获取   请求名--真实类全名对应关系
        //      Tomcat底层有一个集合(请求名字,对象)
        //      反射  通过类名创建对象
        FilterChain chain = new ApplicationFilterChain();
        chain.addFilter(new FilterOne());
        chain.addFilter(new FilterTwo());
        chain.addFilter(new FilterThree());
        //做事
        chain.doFilter();
    }
}
控制台输出 责任链模式的执行原理
上一篇 下一篇

猜你喜欢

热点阅读