责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如是Apache Tomcat 的对Encoding的 处理,Struts2 的拦截器, jsp servlet 的Filter 等等,都是基于责任链模式设计的。比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。但是责任链模式不仅仅的的就局限于这一种的最简单的应用,比如通信领域的短信验证码的获取,请求验证码---->发送验证码-----> 处理验证码----->提交验证码----->得到结果 等等的应用都和责任链模式密布可分。不一定非要在设计中就是用设计模式,但是联系联系周围的环境,思考思考周边的应用,自然的规律的轮回,都都感觉和设计模式有瓜葛。
现在就模拟对网站信息处理的字符处理展示下什么是责任链模式:
需要准备一下几个类:
Filter :处理过滤信息的过滤接口类
/**
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 处理过滤信息的过滤接口类
*/
public interface Filter {
public String doFilter(String msg) ;
}
HTMLFilter负责专门过滤HTML代码的过滤器 实现了Filter 接口
package org.bestupon.pd.filter;
/**
*
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 负责专门过滤HTML代码的过滤器 实现了Filter 接口
*/
public class HtmlFilter implements Filter {
@Override
public String doFilter(String msg) {
String result = msg.replace("<", "[").replace(">", "]");
return result;
}
}
SesitiveFilter :负责了处理敏感词汇的过滤器 实现了Filter 接口
package org.bestupon.pd.filter;
/**
*
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 负责了处理敏感词汇的过滤器 实现了Filter 接口
*/
public class SesitiveFilter implements Filter{
@Override
public String doFilter(String msg) {
return msg.replaceAll("敏感", "普通词汇");
}
}
package org.bestupon.pd.filter;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 负责了处理敏感词汇的过滤器 实现了Filter 接口
* 实现Filter 接口的主要原因是:将自身也设计成一个Filter,容易构建一个chain。
*/
public abstract class AbsractFilterChian implements Filter {
public List<Filter> filters = new ArrayList<Filter>();
public abstract String doFilter(String msg) ;
public abstract AbsractFilterChian addAbsractFilterChian(Filter filter);
}
package org.bestupon.pd.filter;
/**
*
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 提供处理的对外统一接口
*/
public class MsgProcessor {
/**
* 多个过滤器组合到一起之后就会形成过滤器链。
* 好处是过滤规则的排序,
* 先后顺序的的原因,新旧规则可以灵活的替换更新
* 责任链模式
*/
private AbsractFilterChian chian;
public AbsractFilterChian getChian() {
return chian;
}
public void setChian(AbsractFilterChian chian) {
this.chian = chian;
}
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String process() {
return chian.doFilter(msg);
}
}
package org.bestupon.pd.filter;
import org.apache.log4j.Logger;
/**
*
* @author Bestupon
* @EMail : bestupon@foxmail.com
* 外部(客户端调用)
*/
public class Main {
private static Logger log = Logger.getLogger(Main.class);
public static void main(String[] args) {
String msg = "<Script language='javascript'>javascript 代码</script> 敏感信息";
AbsractFilterChian chian = new FilterChian();
chian.addAbsractFilterChian(new HtmlFilter());
AbsractFilterChian chian2 = new FilterChian();
chian2.addAbsractFilterChian(new SesitiveFilter());
chian.addAbsractFilterChian(chian2);
MsgProcessor processor = new MsgProcessor();
processor.setChian(chian);
processor.setMsg(msg);
log.info("HTML结果:" + processor.process());
}
}
运行结果:16:50:37,640 INFO [org.bestupon.pd.filter.Main] HTML结果:[Script language='javascript']javascript 代码[/script] 普通词汇信息
分享到:
相关推荐
设计模式之责任链模式源码 设计模式之责任链模式源码 设计模式之责任链模式源码
【设计模式】之责任链模式责任链模式概念责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果
介绍职责链模式(Chainofresponsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿
spring责任链模式详解,包含项目中应用
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
职责链模式 设计模式 Chain of Responsibility 若有问题望指出。
责任链模式代码
一、责任链模式 现有 “战士”、“班长”、“排长”、“连长”,“营长”五种角色,当有人要请假时要进行以下处理 1.只能是下级象上级请假(如“排长”只能向“连长请假”) 2.班长可以批准1天内的假期,排长批5天,...
设计模式之职责链模式的代码详解,简单明了的将模式思想以代码编写出来,常用的设计模式
C# 职责链模式 代码 模型代码,学习。
责任链模式demo
在《Head First Design Patterns》文中是这么介绍责任链模式的,“通过责任链模式,你可以为某个请求创建一个对象链。每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象”,这句话已经很好了解...
责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar
责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的...
设计模式之责任链模式,使用形象化例子来解释说明。
设计模式的责任链模式的例子,希望对大家有用~~~~~~~~
设计模式之责任链模式Java版本实现和UML类图设计
ios平台中通过最简单的代码讲解责任链模式,可在博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html中查看简单解释
开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒,这是很典型的行为责任链模式。 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的...