链表结构
Node类(节点) 每一个对象 管理一个值
0.属性 Node prev (找到上一个责任人在哪里)
1.属性 Object value (存值)
2.属性 Node next (找到下一个责任人在哪里)
过滤器链(责任链设计模式)
Chain of Responsbility Pattern
Filter类 每一个filter对象 管理当前filter做的事情
doFilter方法
模拟过滤器链底层
package myfilterchain;
public interface FilterChain {
void addFilter(Filter filter);
void doFilter();
}
package myfilterchain;
public interface Filter {
void doFilter(FilterChain chain);
}
package myfilterchain;
public abstract class HttpFilter implements Filter{
@Override
public abstract void doFilter(FilterChain chain);
}
package myfilterchain;
import java.util.ArrayList;
//这个类负责将所有Filter对象串联起来
public class ApplicationFilterChain implements FilterChain{
//需要一个容器将所有的Filter对象存储起来---集合
private ArrayList<Filter> filterArrayList=new ArrayList<>();
private int index=0;
//提供一个方法将反射得来的对象存入集合,此处省略反射解析过程
@Override
public void addFilter(Filter filter){
filterArrayList.add(filter);
}
//每次找寻一个责任人
@Override
public void doFilter(){
if(index<filterArrayList.size()){//按顺序找责任人并让责任人做事
Filter currentFilter=filterArrayList.get(index++);
currentFilter.doFilter(this);
}else {
//找真正的资源做事,此处略
System.out.println("我去找真正的资源做事了");
}
}
}
package myfilterchain;
public class FilterOne extends HttpFilter{
@Override
public void doFilter(FilterChain chain) {
//做自己的事
System.out.println("one做事");
//找管理者,让管理者找下一个责任人 放行
chain.doFilter();
}
}
package myfilterchain;
public class FilterTwo extends HttpFilter{
@Override
public void doFilter(FilterChain chain) {
//做自己的事
System.out.println("two做事");
//找管理者,让管理者找下一个责任人 放行
chain.doFilter();
}
}
package myfilterchain;
public class FilterThree extends HttpFilter{
@Override
public void doFilter(FilterChain chain) {
//做自己的事
System.out.println("three做事");
//找管理者,让管理者找下一个责任人 放行
chain.doFilter();
}
}
package myfilterchain;
//模拟存入Filter对象后过滤链
public class FilterTestMain {
public static void main(String[] args){
//Tomcat启动,读取web.xml配置文件,
//目的获取请求名---真实类名对应关系,Tomcat底层有一个集合(请求名字,对象)
//反射 通过类名创建对象
FilterChain filterChain=new ApplicationFilterChain();
filterChain.addFilter(new FilterOne());
filterChain.addFilter(new FilterTwo());
filterChain.addFilter(new FilterThree());
filterChain.doFilter();
}
}