责任链就是链条式处理请求,当我们的请求到来,会经过一条对象链,这条链上有多个节点对象,它们都会对请求的数据进行解析处理, 这样的话, 后期如果要增加新的功能,只需要在链条中增加一个节点就可以了!
就像我们servlet中Filter一样,每一个Filter都拦截处理请求,且处理完毕后交给下一个Filter进行处理,这就是典型的责任链模式;今天废话不多说,直接写责任链模式的代码;
现在需要你为公司网站设计一个内容过滤系统,你应该怎么来做?简单的说,该功能就是将用户上传的文本内容进行验证与过滤! 在动手写代码前,你应该考虑到,这是一个多变的系统,最开始你可能只需要过滤某些内容,替换某些敏感词汇,而随着时间的推进,更多更复杂的过滤规则需要添加进来,这就需要你的设计有一个好的扩展性,如此,我们就可以采用责任链模式了!
//抽象内容过滤器
abstract class ContentFilter{
protected ContentFilter cf ;
//获得下一个过滤器
public ContentFilter getNextFilter() {return cf;}
//设置下一个内容过滤器
public void setNextFilter(ContentFilter cf) {this.cf = cf;}
//处理用户提交内容的方法
abstract String doFilter(String content);
}
//敏感词汇过滤器
class SensitiveContentFilter extends ContentFilter{
@Override
String doFilter(String content) {
String newContent = content.replaceAll("不雅词1", "")
.replaceAll("不雅词2", "");
//如果客户端有设置下一个过滤器,则将处理后的数据转交给它进行处理
return this.getNextFilter()!=null?this.getNextFilter().doFilter(newContent):newContent;
}
}
//违规内容过滤器,比如检测到图片超链接涉嫌限制级...
class PornographicContentFilter extends ContentFilter{
@Override
String doFilter(String content) {
//我就随意写一下,实际上需要先抓取超链接得到资源流再调用图片智能分析系统来进行鉴定...
String newContent = content.replaceAll("<img src='yello.jpg'/>", "");
return this.getNextFilter()!=null?this.getNextFilter().doFilter(newContent):newContent;
}
}
public class Test {
public static void main(String[] args) {
String content = "我建议大家一定要一起不雅词1,然后再不雅词2,如果你不这样做的话,"
+ "可能会像下图中一样,<img src='yello.jpg'/>"
+ "很惨的!看到了么,<script/>大家点一下这个地方试试!";
SensitiveContentFilter sf = new SensitiveContentFilter();
PornographicContentFilter pf = new PornographicContentFilter();
sf.setNextFilter(pf);
content = sf.doFilter(content);
System.out.println(content);
}
}
我建议大家一定要一起,然后再,如果你不这样做的话,可能会像下图中一样,很惨的!看到了么,<script/>大家点一下这个地方试试!
*******************************************************************
Ok,如我们所料,敏感词和违规图片都被屏蔽了;可突然有一天,BOSS说网站最近老受到恶意攻击,经排插发现是用户提交的内容带有恶意代码,所以你要过滤掉这些代码...很简单嘛!由于使用了责任链模式,我们只要再加一个过滤器就可以啦,就像下面这样:
//恶意脚本分析过滤器
class ScriptContentFilter extends ContentFilter{
@Override
String doFilter(String content) {
//我就随意写一下,实际上不是简单的替换下就行的,需要进行数据语义分析的...
String newContent = content.replaceAll("script", "");
return this.getNextFilter()!=null?this.getNextFilter().doFilter(newContent):newContent;
}
}
public class Test {
public static void main(String[] args) {
String content = "我建议大家一定要一起不雅词1,然后再不雅词2,如果你不这样做的话,"
+ "可能会像下图中一样,<img src='yello.jpg'/>"
+ "很惨的!看到了么,<script/>大家点一下这个地方试试!";
SensitiveContentFilter sf = new SensitiveContentFilter();
PornographicContentFilter pf = new PornographicContentFilter();
sf.setNextFilter(pf);
//再创建一个恶意脚本过滤器,且将违规内容过滤器的下一个过滤器指向它
ScriptContentFilter scriptF = new ScriptContentFilter();
pf.setNextFilter(scriptF);
content = sf.doFilter(content);
System.out.println(content);
}
}
输出*********************************************************
我建议大家一定要一起,然后再,如果你不这样做的话,可能会像下图中一样,很惨的!看到了么,</>大家点一下这个地方试试!
**************************************************************
好啦!责任链模式就这么简单!