浏览 10684 次
锁定老帖子 主题:责任链模式一
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-26
责任链模式(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] 普通词汇信息
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-18
/** * 貌似chian 写错了. * chian n. 沥青,柏油. * chain n. 链;束缚;枷锁. * 2010/06/18 14:27:45 */ |
|
返回顶楼 | |
发表时间:2010-06-18
楼主再好好想个例子吧.....
这个例子用错了. |
|
返回顶楼 | |
发表时间:2010-06-18
weather 写道 /** * 貌似chian 写错了. * chian n. 沥青,柏油. * chain n. 链;束缚;枷锁. * 2010/06/18 14:27:45 */ 的确写错了!应该是chain! |
|
返回顶楼 | |
发表时间:2010-06-18
异常说得没错,你这个例子确实用错了,servlet的Filter是责任链模式,但你这个不是,你这个充其量算是Composite模式而已.
|
|
返回顶楼 | |
发表时间:2010-06-18
引用 比如通信领域的短信验证码的获取,请求验证码---->发送验证码-----> 处理验证码----->提交验证码----->得到结果 等等的应用都和责任链模式密布可分。
我第一直觉是用State模式 |
|
返回顶楼 | |