【java设计模式】责任链模式
可以随时添加过滤器,并在主方法中添加删除:
Main
1 package com.tn.filter; 2 3 public class Main { 4 public static void main(String[] args) { 5 String msg="你好,:)哈哈,<HTML>,被加薪,敏感。被加薪,,呵呵。"; 6 7 MsgProcessor mp=new MsgProcessor(); 8 FilterChain filterChain=new FilterChain(); 9 filterChain.addFilter(new HTMLFilter()) 10 .addFilter(new SmileFaceFilter()); 11 12 FilterChain filterChain2=new FilterChain(); 13 filterChain2.addFilter(new SensitiveFilter()); 14 15 filterChain.addFilter(filterChain2); 16 17 mp.setMsg(msg); 18 mp.setFilterChain(filterChain); 19 20 String result=mp.process(); 21 System.out.println(result); 22 System.out.println(msg); 23 } 24 }
MsgProcessor
1 package com.tn.filter; 2 3 public class MsgProcessor { 4 /* 5 HTMLFilter htmlFilter; 6 SensitiveFilter sensitiveFilter; 7 */ 8 // Filter[] filters={new HTMLFilter(),new SensitiveFilter(),new SmileFaceFilter()}; 9 FilterChain filterChain; 10 private String msg; 11 12 public FilterChain getFilterChain() { 13 return filterChain; 14 } 15 16 public void setFilterChain(FilterChain filterChain) { 17 this.filterChain = filterChain; 18 } 19 20 public String getMsg() { 21 return msg; 22 } 23 24 public void setMsg(String msg) { 25 this.msg = msg; 26 } 27 public String process(){ 28 // String r=msg.replaceAll("<", "【") 29 // .replaceAll(">", "】") 30 // .replace("被加薪", "加薪"); 31 /* 32 htmlFilter=new HTMLFilter(); 33 sensitiveFilter=new SensitiveFilter(); 34 String r=htmlFilter.dofilter(msg); 35 r=sensitiveFilter.dofilter(r); 36 */ 37 38 /* 39 for(Filter f:filters){ 40 msg=f.dofilter(msg); 41 } 42 return msg; 43 */ 44 return filterChain.dofilter(msg); 45 } 46 }
FilterChain
1 package com.tn.filter; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class FilterChain implements Filter{ 7 private List<Filter> filters=new ArrayList<Filter>(); 8 9 public FilterChain addFilter(Filter f){ 10 filters.add(f); 11 return this; 12 } 13 14 public String dofilter(String str){ 15 String result=str; 16 for(Filter f:filters){ 17 result=f.dofilter(result); 18 } 19 return result; 20 } 21 }
Filter
1 package com.tn.filter; 2 3 public interface Filter { 4 public String dofilter(String str); 5 }
HTMLFilter
1 package com.tn.filter; 2 3 public class HTMLFilter implements Filter { 4 5 @Override 6 public String dofilter(String str) { 7 return str.replaceAll("<", "[") 8 .replaceAll(">", "]"); 9 } 10 }
SensitiveFilter
1 package com.tn.filter; 2 3 public class SensitiveFilter implements Filter { 4 5 @Override 6 public String dofilter(String str) { 7 return str.replaceAll("被加薪", "加薪") 8 .replaceAll("敏感", "和谐"); 9 } 10 11 }
SmileFaceFilter
1 package com.tn.filter; 2 3 public class SmileFaceFilter implements Filter { 4 5 @Override 6 public String dofilter(String str) { 7 return str.replaceAll(":\)", "笑脸"); 8 } 9 10 }
顺序处理request,逆序处理response:
Main
1 package com.tn.filter2; 2 3 public class Main { 4 public static void main(String[] args) { 5 String msg="你好,:)哈哈,<HTML>,被加薪,敏感。被加薪,,呵呵。"; 6 FilterChain fc=new FilterChain(); 7 fc.addFilter(new HTMLFilter()) 8 .addFilter(new SensitiveFilter()); 9 Request request=new Request(); 10 request.setStr(msg); 11 Response response=new Response(); 12 13 System.out.println(request.getStr()); 14 System.out.println(response.getStr()); 15 16 fc.doFilter(request, response,fc); 17 18 System.out.println(request.getStr()); 19 System.out.println(response.getStr()); 20 } 21 }
FilterChain
1 package com.tn.filter2; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class FilterChain implements Filter { 7 List<Filter> filters=new ArrayList<Filter>(); 8 int index=0; 9 public FilterChain addFilter(Filter f){ 10 filters.add(f); 11 return this; 12 } 13 @Override 14 public void doFilter(Request request, Response response,FilterChain fc) { 15 if(index==filters.size()) return; 16 Filter f=filters.get(index++); 17 // filters.get(index).doFilter(request, response, fc);//这种写法会死循环,此语句的doFilter会调用FilterChain里的doFilter(),而不是调用具体Filter里的doFilter(),切记! 18 f.doFilter(request, response, fc); 19 // for(Filter f:filters){ 20 // f.doFilter(request, response,fc); 21 // } 22 } 23 24 }
Filter
1 package com.tn.filter2; 2 3 public interface Filter { 4 void doFilter(Request request,Response response,FilterChain fc); 5 }
HTMLFilter
1 package com.tn.filter2; 2 3 public class HTMLFilter implements Filter { 4 5 @Override 6 public void doFilter(Request request, Response response,FilterChain fc) { 7 request.setStr(request.getStr().replaceAll("<", "【")+" -HTMLFilter()- "); 8 fc.doFilter(request, response, fc); 9 response.setStr(response.getStr()+" -HTMLFilter()- "); 10 } 11 12 }
SensitiveFilter
1 package com.tn.filter2; 2 3 public class SensitiveFilter implements Filter{ 4 @Override 5 public void doFilter(Request request, Response response,FilterChain fc) { 6 request.setStr(request.getStr().replaceAll("被加薪", "加薪")+" -SensitiveFilter()- "); 7 fc.doFilter(request, response, fc); 8 response.setStr(response.getStr()+" -SensitiveFilter()- "); 9 } 10 }
Request
1 package com.tn.filter2; 2 3 public class Request { 4 String str; 5 6 public String getStr() { 7 return str; 8 } 9 10 public void setStr(String str) { 11 this.str = str; 12 } 13 14 }
Response
1 package com.tn.filter2; 2 3 public class Response { 4 String str="response"; 5 6 public String getStr() { 7 return str; 8 } 9 10 public void setStr(String str) { 11 this.str = str; 12 } 13 14 }