标签:
入正题,需求:假如我想对一些信息进行一定规则的过滤.
首先定义一个Main类:
package cn.asto.filter; public class Main { String str = "<script> hello 大家好! 敏感词汇!"; }
我想对javacript标签进行过滤,对敏感词汇进行过滤。
定义MsgProcessor:
package cn.asto.filter; public class MsgProcessor { private String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String process(){ String result = msg.replace("<", "[").replace(">", "]"); result = result.replace("敏感词汇", "根据法律,相关内容不能显示"); return result; } }
修改Main类:
package cn.asto.filter; public class Main { public static void main(String args[]){ String str = "<script> hello 大家好! 敏感词汇!"; MsgProcessor msgProcessor = new MsgProcessor(); msgProcessor.setMsg(str); String result = msgProcessor.process(); System.out.println(result); } }
输出:
[script] hello 大家好! 根据法律,相关内容不能显示!
看到html标签和敏感词汇被过滤掉了,很简单,就是定义了一个MsgProcessor,里面存一个msg,定义一个process方法用来替换相关字符,返回替换后的字符.
这和责任链还扯得有点远了。继续往下走。上面的做法,我们没办法决定MsgProcessor中处理链。每当有一个新的过滤需求,就得重写一个MsgProcessor,多扯淡。
现在定义一个Filer接口:
package cn.asto.filter; public interface Filter { public String doFilter(String str); }
写两个Filter类:
SensitiveFilter:
package cn.asto.filter; public class SensitiveFilter implements Filter{ @Override public String doFilter(String str) { String result = str.replace("敏感词汇", "根据法律,相关内容不能显示!"); return result; } }
HtmlFilter:
package cn.asto.filter; public class HtmlFilter implements Filter{ @Override public String doFilter(String str) { String result = str.replace("<", "[").replace(">", "]"); return result; } }
定义一个FilterChain(FilterChain中就对装入的msg,做遍历List<Filter>doFilter方法,返回处理的结果):
package cn.asto.filter; import java.util.ArrayList; import java.util.List; public class FilterChain implements Filter { List<Filter> filters = new ArrayList<Filter>(); public FilterChain addFilter(Filter f){ filters.add(f); return this; } @Override public String doFilter(String str) { for(Filter filter :filters){ str = filter.doFilter(str); } return str; } }
此时在MsgFilter要干点什么呢?
装入一个msg(将要被处理的String),一条装上了几个Filter或者FilterChain的FilterChain,就可以了。
package cn.asto.filter; public class MsgProcessor { private String msg; private FilterChain fc ; public String getMsg() { return msg; } public FilterChain getFc() { return fc; } public void setFc(FilterChain fc) { this.fc = fc; } public void setMsg(String msg) { this.msg = msg; } public String process(){ return fc.doFilter(msg); } }
在main方法中,定义一个装了几个Filter的FilterChain链,定义一个要被处理的字符串,作为参数传入msgProcessor对象,调用process()返回结果。
package cn.asto.filter; public class Main { public static void main(String args[]){ String str = "<script> hello 大家好! 敏感词汇!"; FilterChain fc = new FilterChain(); fc.addFilter(new HtmlFilter()).addFilter(new SensitiveFilter()); MsgProcessor msgProcessor = new MsgProcessor(); msgProcessor.setMsg(str); msgProcessor.setFc(fc); String result = msgProcessor.process(); System.out.println(result); } }
写到这里有点责任链的味道了。哈哈
上个图先:
创建HtmlFilter,SensitiveFilter实例化FilterChain,将msg和FilterChain实例化对象传入MsgProcessor构造msgProcessor,调用msgProcessor.process方法,实际上就是调用了FilterChain.doFilter,在往上说,就是遍历调用FilterChain中的HtmlFilter和SensitiveFilter的doFilter方法。实现讲完了。
来来来,我们来抽象一下过程。
一条msg经过一条FilterChain链条的磨练,通过了党中央宪法的校验,成为了一条合理合法的result!
这个FilterChain就是我们的责任链,这就是简单的责任链模式!
标签:
原文地址:http://www.cnblogs.com/think-in-java/p/4745942.html