JAVA设计模式--责任链模式
--这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。可以有树形结构和链式结构
何时使用:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统一接口。
关键代码:Handler 里面聚合它自己,在 HanleRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
缺点: 1、不能保证请求一定被接收(我们在程序设计的时候可以增加未接受的处理)。 2、没有简单的if(){}else{}好理解
使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。
注意事项:在 JAVA WEB 中遇到很多应用。
具体应用代码:实现一个过滤器的功能,完成敏感字词的过滤.(对请求和相应分别过滤)
思路:1、if(){}else{}或者swith选择语句
1.1缺点:无限的累积判断条件,但代码量到达一定数量时,代码的可读性会大大降低;请求者与处理者之间的耦合关系愈来愈密切.
1.2优点:代码在一定量上的可读性很高
2、利用责任链这种设计模式实现
2.1缺点:各种类的的调用会比较麻烦,但是有思路以后会很清晰
2.2优点:使请求者与处理者解耦
代码实现:
1、对定义的字符串进行过滤
1 //主方法,实现测试功能 2 public static void main(String[] args) { 3 String str="qwer,asdf,放弃我的所有我的一切无所谓,纸短情长啊"; 4 Request request = new Request(); 5 request.setRequestStr(str); 6 7 Response response = new Response(); 8 response.setResponsesStr("response"); 9 10 FilterChain fc = new FilterChain(); 11 fc.addFilter(new FilterOne()) 12 .addFilter(new FilterTwo()); 13 14 fc.doFilter(request, response,fc); 15 System.out.println(request.getRequestStr()); 16 System.out.println(response.getResponsesStr()); 17 }
2、定义接口,以及实现类,先写两个过滤器(FilterChain 实现了对两个拦截器的调用)
public interface FilterInterface { public void doFilter(Request request,Response response,FilterChain chain); }
public class FilterChain implements FilterInterface { List<FilterInterface> filters = new ArrayList<>(); int index = 0; public FilterChain addFilter(FilterInterface f) { this.filters.add(f); return this; } //注意 @Override public void doFilter(Request request, Response response,FilterChain chain) { //for (FilterInterface f : filters) { // f.doFilter(request, response,chain); //} if(index==filters.size()) return; FilterInterface f =filters.get(index); index++; f.doFilter(request, response, chain); } }
public class FilterOne implements FilterInterface{ @Override public void doFilter(Request request, Response response,FilterChain chain) { // TODO Auto-generated method stub request.requestStr=request.requestStr.replace("qwer", "怎么会爱上了") +"***************HtmlFilter"; chain.doFilter(request, response, chain); response.responsesStr+="***************HtmlFilter"; } }
public class FilterTwo implements FilterInterface { @Override public void doFilter(Request request, Response response,FilterChain chain) { // TODO Auto-generated method stub request.requestStr=request.requestStr.replace("asdf", "并决定跟他回家")+"***************SesitiveFilter"; chain.doFilter(request, response, chain); response.responsesStr+="***************SesitiveFilter"; } }
3、定义请求和响应的类
4、测试:注意执行顺序
怎么会爱上了,并决定跟他回家,放弃我的所有我的一切无所谓,纸短情长啊***************HtmlFilter***************SesitiveFilter
response***************SesitiveFilter***************HtmlFilter