责任链模式(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] 普通词汇信息