版权声明:有问题欢迎留言,转载请声明出处 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 的层层嵌套