码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式——责任链模式

时间:2015-09-15 20:25:08      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

使用场景:

现在有如下字符     :) English < > ,现在想把其转换为  ^V^ 英文 [],并且根据要求对  :) English  < >这个三类分别转换

解决办法:

(1)if else进行处理

(2)定义一个Filter接口,然后在定义三个实现Filter的类,根据具体的需求定义一个FilterChain。类图如下:

//注意:addFilter(Filter)返回值是 FilterChain,这是为了方便后面的链式编程

技术分享

场景:如果实现Filter接口的多个类要组合成一个整体使用。

解决办法:将这几个类组合成为一个FilterChian,同时FilterChain继承Filter接口


具体代码:

//Filter接口
public interface Filter {
   String doFilter(String str);
}

//实现Filter接口的类
public class EnglishFilter implements Filter {
   public String doFilter(String str) {
      String r = str.replace("English", "英文");
      return r;
   }
}


public class FaceFilter implements Filter {

   public String doFilter(String str) {
      return str.replace(":)", "^V^");
   }
}

public class HTMLFilter implements Filter {

   public String doFilter(String str) {
      String r = str.replace(‘<‘, ‘[‘)
               .replace(‘>‘, ‘]‘);
      return r;
   }
}

//FilterChain(对FilterChain中的Filter以此进行处理)
public class FilterChain implements Filter {
   List<Filter> filters = new ArrayList<Filter>();
   
   public FilterChain addFilter(Filter f) {
      this.filters.add(f);
      return this;
   }
   
   public String doFilter(String str) {
      String r = str;
      for(Filter f: filters) {
         r = f.doFilter(r);
      }
      return r;
   }
}

//处理流程的分装,只需要传入处理的数据,和调用的FilterChain
public class MsgProcessor {
    
   //省略setter,getter方法
   private String msg;
   FilterChain fc;
   
   public String process() {
      return fc.doFilter(msg);
   }
}

//测试方法
public static void main(String[] args) {
   //需要处理的数据
   String msg = ":) English < >";
   //定义初始化处理的方法
   MsgProcessor mp = new MsgProcessor();
   //传入数据
   mp.setMsg(msg);
   //定义初始化FilterChain
   FilterChain fc = new FilterChain();
   //这里便是addFilter(Filter)返回值是 FilterChain好处
   fc.addFilter(new HTMLFilter())
     .addFilter(new EnglishFilter());

   FilterChain fc2 = new FilterChain();
   fc2.addFilter(new FaceFilter());
   //将这几个实现Filter接口的类组合成为一个FilterChian,添加到另一个FilterChain中
   fc.addFilter(fc2);
   //传入FilterChain
   mp.setFc(fc);
   String result = mp.process();
   System.out.println(result);
}

上面只是一个简单的Filter,对于web中request和response都需要拦截的拦截器该如何编写呢?

注意区别:上面的是一条直链

 web中的链条还要折回来,并且response处理的顺序和request的顺序相反。

解决办法:doFilter(request,response,filterChain),多加一个filterChain参数



设计模式——责任链模式

标签:

原文地址:http://my.oschina.net/u/2361475/blog/506444

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!