装饰者模式-星巴克

来源:互联网 发布:移动数据闲时流量包 编辑:程序博客网 时间:2024/04/30 01:26
[java] view plaincopy
  1. //过滤器接口  
  2. public interface Filter {  
  3.     public void doFilter(Request req,Response res,FilterChain c);  
  4. }  
[java] view plaincopy
  1. //HTML的过滤器  
  2. public class HTMLFilter implements Filter{  
  3.     @Override  
  4.     public void doFilter(Request req, Response res,FilterChain fc) {  
  5.         req.requestStr=req.requestStr.replace("<""[");  
  6.         req.requestStr=req.requestStr.replace(">""]")+"--HTMLFilter";  
  7.         fc.doFilter(req, res, fc);//在这里它会调用过滤链中的下一个filter  
  8.         //等整个过滤链处理完了之后也就是fc.doFilter(req, res, fc);这段  
  9.         //处理完了之后就会执行下面的方法了res.responseStr+="--HTMLFilter";  
  10.         //然后依次的过滤器都执行这列的这行代码,也就会变成了倒序执行  
  11.         res.responseStr+="--HTMLFilter";  
  12.     }  
  13. }  
[java] view plaincopy
  1. //敏感词的过滤器  
  2. public class SensitiveFilter implements Filter{  
  3.     @Override  
  4.     public void doFilter(Request req, Response res,FilterChain fc) {  
  5.         req.requestStr=req.requestStr.replace("敏感""mingan")+"--SensitiveFilter";  
  6.         fc.doFilter(req, res, fc);  
  7.         res.responseStr+="--SensitiveFilter";  
  8.     }  
  9. }  
[java] view plaincopy
  1. //客户端传递的内容到服务器  
  2. //模拟javaweb中的request  
  3. public class Request {  
  4.     public String requestStr;  
  5. }  
[java] view plaincopy
  1. //服务器反馈的内容到客户端  
  2. //模拟javaweb中的response  
  3. public class Response {  
  4.     public String responseStr;  
  5. }  
[java] view plaincopy
  1. //过滤器链  
  2. public class FilterChain implements Filter{  
  3.     private List<Filter> list=new ArrayList<Filter>();  
  4.     public FilterChain addfilter(Filter filter){  
  5.         list.add(filter);  
  6.         return this;  
  7.     }  
  8.     int index=0;  
  9.     @Override  
  10.     public void doFilter(Request req, Response res,FilterChain fc) {  
  11.         if(index==list.size())return;  
  12.         Filter f=list.get(index);  
  13.         index++;  
  14.         //依次执行下一个过滤器,直到整个过滤器链执行完  
  15.         f.doFilter(req, res, fc);  
  16.     }  
  17. }  
[java] view plaincopy
  1. public class Client {  
  2.     /* 
  3.      * Request:客户端发送给服务端的信息 
  4.      * Response:服务端反馈给客户端的信息 
  5.      * 要实现的功能是:Request携带的信息所经过的过滤器 
  6.      * 要跟Response所携带的信息所经过的过滤器相反 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         Request req=new Request();  
  10.         Response res=new Response();  
  11.         req.requestStr="这是我的一个敏感链接<a>优酷</a>";  
  12.         res.responseStr="response";  
  13.         FilterChain  fc=new FilterChain();  
  14.         fc.addfilter(new HTMLFilter());  
  15.           
  16.         FilterChain fc1=new FilterChain();  
  17.         fc1.addfilter(new SensitiveFilter());  
  18.         fc.addfilter(fc1);//在一个过滤链上面再加上一个过滤链  
  19.           
  20.         fc.doFilter(req, res,fc);  
  21.         System.out.println(req.requestStr);  
  22.         System.out.println(res.responseStr);  
  23.     }  
  24.     /** 
  25.      * 执行结果: 
  26.      * 这是我的一个mingan链接[a]优酷[/a]--HTMLFilter--SensitiveFilter 
  27.      * response--SensitiveFilter--HTMLFilter 
  28.      */  
  29. }