天津网站建设学习,表白网页设计代码大全,品牌设计公司名称大全,广州微信小程序开发工作室原理和实现
模板模式变化的是其中一个步骤#xff0c;而责任链模式变化的是整个流程。 将请求的发送和接收解耦合#xff0c;让多个接收对象有机会可以处理这个请求#xff0c;形成一个链条。不同的处理器负责自己不同的职责。
定义接口
public interface Filter {/*** …原理和实现
模板模式变化的是其中一个步骤而责任链模式变化的是整个流程。 将请求的发送和接收解耦合让多个接收对象有机会可以处理这个请求形成一个链条。不同的处理器负责自己不同的职责。
定义接口
public interface Filter {/*** 执行过滤方法* param request* param response* param filterChain*/void doFilter (Request request, Response response,FilterChain filterChain);
}定义职责链 通过内部一个链表 将职责链添加到对应的链表中
public class FilterChain implements Filter{private static ListFilter filterList new LinkedList();private Filter myFilter;private static int filterIndex 0;/*** 添加一个职责工作链* param filter*/public void addFilter (Filter filter) {filterList.add(filter);}public void addMyFilter (Filter filter) {myFilter filter;}Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {if (filterIndex filterList.size()) {Filter filter filterList.get(filterIndex);filterIndex;filter.doFilter(request,response,filterChain);} else {myFilter.doFilter(request,response,filterChain);}}
}public class HttpFilter implements Filter{Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println(httpFilter before...);filterChain.doFilter(request,response,filterChain);System.out.println(httpFilter after...);}
}public class MyFilter implements Filter{Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println(MyFilter before...);System.out.println(hahaha 我是中间执行人);System.out.println(MyFilter after...);}
}public class EncodingFilter implements Filter{Overridepublic void doFilter(Request request, Response response, FilterChain filterChain) {System.out.println(EncodingFilter before...);filterChain.doFilter(request,response,filterChain);System.out.println(EncodingFilter after...);}
}public static void main(String[] args) {FilterChain filterChain new FilterChain();Filter httpFilter new HttpFilter();Filter encodingFilter new EncodingFilter();Filter myFilter new MyFilter();filterChain.addFilter(httpFilter);filterChain.addFilter(encodingFilter);filterChain.addMyFilter(myFilter);filterChain.doFilter(new Request(),new Response(),filterChain);}其实不管是模板模式、策略模式、职责链模式 本质都是为了提高代码的拓展性、应对代码的复杂性并且如果新增一个过滤器那么只需要进行拓展、也满足开闭原则。
在实际的工作中需要考虑什么场景下符合就采用对应的设计模式而不要乱用。
servlet中Filter就是职责链的体现。