【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 }

 

posted @ 2017-05-06 18:27  xiongjiawei  阅读(156)  评论(0编辑  收藏  举报