过滤器链(责任链设计模式)
链表结构
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();
}
}
控制台输出
责任链模式的执行原理
网友评论