责任链模式(Chain of Responsibility)能够说是一个很是很是经常使用的模式,开源框架、 tomcat、jetty、mina 等里面处处都是。java
最初学习这个模式的时候,各类版本的都有,反正设计模式也只是给出了一个抽象的表达,并没说怎么写才是对的,只要把思想表达出来就能够了,未必要把本身框死在某个范围里面。设计模式
可是呢,在看开源框架的时候,发现牛人们彷佛都喜欢用同一种写法来表达这个模式,因此也就细细的思考了一会,虽说不出来一个因此然来,但仍是以为牛人们的写法就是好,因此就写了这篇文章。tomcat
如下是责任链模式的开源代码里面的最多见的版本。框架
package design.filter.filter3; /** * 过滤器接口 * @author li * */ public interface Filter { void doFilter(Request req, Response res, FilterChain chain); }
package design.filter.filter3; /** * 过滤器链 * @author li * */ public interface FilterChain { void invokeNext(Request req, Response res); }
package design.filter.filter3; public class Request { }
package design.filter.filter3; public class Response { }
package design.filter.filter3; import java.util.Vector; /** * 过滤器支持类 * @author li * */ public class FilterSuport { private Vector<Filter> filters = new Vector<Filter>(); public FilterSuport addFilter(Filter f) { filters.add(f); return this; } public void invoke(Request req, Response res) { new FilterChainSupport().invokeNext(req, res); } /** * 过滤器链表支持类 * @author li * */ private class FilterChainSupport implements FilterChain { int index = -1; @Override public void invokeNext(Request req, Response res) { if (++index < filters.size()) { filters.get(index).doFilter(req, res, this); } else { return; } } } }
package design.filter.filter3;
//测试 public class Test { public static void main(String[] args) { Request req = new Request(); Response res = new Response(); FilterSuport chain = new FilterSuport(); chain.addFilter(new Filter() { public void doFilter(Request req, Response res, FilterChain chain) { System.out.println("进1"); chain.invokeNext(req, res); System.out.println("出1"); } }).addFilter(new Filter() { public void doFilter(Request req, Response res, FilterChain chain) { System.out.println("进2"); chain.invokeNext(req, res); System.out.println("出2"); } }); chain.invoke(req, res); } }