JDK源码:JavaWeb Filter 中的设计模式——责任链

版权声明:有问题欢迎留言,转载请声明出处 https://blog.csdn.net/larger5/article/details/82288534

一、前言

1、一直想设计自己的框架,也不是想自己造轮子,而是在使用别人的框架,出了问题、用得不顺的时候,不至于手足失措。
2、Spring系框架大量使用了设计模式中的动态代理、工厂模式等,若对相关模式有所理解,可以更好把握源码中的思路。
3、如今代码生成器格外智能,简洁的框架分外众多,而只会简单的CRUD的码农,将渐渐失去价值。

二、代码

代码已经放到GitHub上了:
https://github.com/larger5/Design_pattern_Chain_of_Responsibility_Pattern.git

这里写图片描述
模仿 JavaWeb 中的 Filter,可以对其思路有个很好的把握

1.Filter

package com.cun.filters;

import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;

public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

2.FirstFilter

package com.cun.filters;

import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;

public class FirstFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {

        request.doSomething(this.getClass().getName());

        // 先执行所有request再倒序执行所有response
        chain.doFilter(request, response, chain);

        response.doSomething(this.getClass().getName());
    }
}

3.SecondFilter

package com.cun.filters;

import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;

public class SecondFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        request.doSomething(this.getClass().getName());
        chain.doFilter(request, response, chain);
        response.doSomething(this.getClass().getName());
    }
}

3.ThirdFilter

package com.cun.filters;

import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;

public class ThirdFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        request.doSomething(this.getClass().getName());
        chain.doFilter(request, response, chain);
        response.doSomething(this.getClass().getName());
    }
}

4.Request

package com.cun.main;

public class Request {
    public void doSomething(String str) {
        System.out.println("Request ---> " + str);
    }
}

5.Response

package com.cun.main;

public class Response {
    public void doSomething(String str) {
        System.out.println("Response ---> " + str);
    }
}

6.FilterChain

package com.cun.main;


import com.cun.filters.Filter;

import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter {

    private List<Filter> filters = new ArrayList<Filter>();

    private int index = 0;

    // 链式调用
    public FilterChain addFilter(Filter filter) {
        this.filters.add(filter);
        return this;
    }

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, chain);
    }
}

7.FilterTest 测试

package com.cun.main;

import com.cun.filters.FirstFilter;
import com.cun.filters.SecondFilter;
import com.cun.filters.ThirdFilter;
import org.junit.Test;

public class FilterTest {

    @Test
    public void Test(){
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter()).addFilter(new ThirdFilter());
        filterChain.doFilter(new Request(),new Response(),filterChain);
    }

}

三、结果

注意:先执行所有request再倒序执行所有response
这里写图片描述
即如下图:
这里写图片描述
从而实现,filter 的层层嵌套
这里写图片描述

猜你喜欢

转载自blog.csdn.net/larger5/article/details/82288534
今日推荐