zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    升级Visual Studio安装已完成,出现警告
    C# 字符串格式
    C# TimeSpan
    git 手册
    Mac clion 远程调试 linux 服务器进程
    C++ 左值引用和右值引用的用处
    Mac OS 快捷键
    MacPorts Guide
    同步异步阻塞非阻塞
    tcp 简单实现
  • 原文地址:https://www.cnblogs.com/xiongjiawei/p/6817606.html
Copyright © 2011-2022 走看看