链表结构
    Node类(节点) 每一个对象 管理一个值
    0.属性 Node prev (找到上一个责任人在哪里)
    1.属性 Object value (存值)
    2.属性 Node next (找到下一个责任人在哪里)

    过滤器链(责任链设计模式)
    Chain of Responsbility Pattern
    Filter类 每一个filter对象 管理当前filter做的事情
    doFilter方法
    image.png

    模拟过滤器链底层

    1. package myfilterchain;
    2. public interface FilterChain {
    3. void addFilter(Filter filter);
    4. void doFilter();
    5. }
    1. package myfilterchain;
    2. public interface Filter {
    3. void doFilter(FilterChain chain);
    4. }
    1. package myfilterchain;
    2. public abstract class HttpFilter implements Filter{
    3. @Override
    4. public abstract void doFilter(FilterChain chain);
    5. }
    1. package myfilterchain;
    2. import java.util.ArrayList;
    3. //这个类负责将所有Filter对象串联起来
    4. public class ApplicationFilterChain implements FilterChain{
    5. //需要一个容器将所有的Filter对象存储起来---集合
    6. private ArrayList<Filter> filterArrayList=new ArrayList<>();
    7. private int index=0;
    8. //提供一个方法将反射得来的对象存入集合,此处省略反射解析过程
    9. @Override
    10. public void addFilter(Filter filter){
    11. filterArrayList.add(filter);
    12. }
    13. //每次找寻一个责任人
    14. @Override
    15. public void doFilter(){
    16. if(index<filterArrayList.size()){//按顺序找责任人并让责任人做事
    17. Filter currentFilter=filterArrayList.get(index++);
    18. currentFilter.doFilter(this);
    19. }else {
    20. //找真正的资源做事,此处略
    21. System.out.println("我去找真正的资源做事了");
    22. }
    23. }
    24. }
    1. package myfilterchain;
    2. public class FilterOne extends HttpFilter{
    3. @Override
    4. public void doFilter(FilterChain chain) {
    5. //做自己的事
    6. System.out.println("one做事");
    7. //找管理者,让管理者找下一个责任人 放行
    8. chain.doFilter();
    9. }
    10. }
    1. package myfilterchain;
    2. public class FilterTwo extends HttpFilter{
    3. @Override
    4. public void doFilter(FilterChain chain) {
    5. //做自己的事
    6. System.out.println("two做事");
    7. //找管理者,让管理者找下一个责任人 放行
    8. chain.doFilter();
    9. }
    10. }
    1. package myfilterchain;
    2. public class FilterThree extends HttpFilter{
    3. @Override
    4. public void doFilter(FilterChain chain) {
    5. //做自己的事
    6. System.out.println("three做事");
    7. //找管理者,让管理者找下一个责任人 放行
    8. chain.doFilter();
    9. }
    10. }
    1. package myfilterchain;
    2. //模拟存入Filter对象后过滤链
    3. public class FilterTestMain {
    4. public static void main(String[] args){
    5. //Tomcat启动,读取web.xml配置文件,
    6. //目的获取请求名---真实类名对应关系,Tomcat底层有一个集合(请求名字,对象)
    7. //反射 通过类名创建对象
    8. FilterChain filterChain=new ApplicationFilterChain();
    9. filterChain.addFilter(new FilterOne());
    10. filterChain.addFilter(new FilterTwo());
    11. filterChain.addFilter(new FilterThree());
    12. filterChain.doFilter();
    13. }
    14. }

    image.png