论坛首页 Java企业应用论坛

责任链模式一

浏览 10652 次
精华帖 (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] 普通词汇信息

 

 

   发表时间:2010-06-18  
/**
 * 	貌似chian 写错了.
 *	chian n. 沥青,柏油.
 *	chain n. 链;束缚;枷锁.
 *  2010/06/18 14:27:45
 */
0 请登录后投票
   发表时间:2010-06-18  
楼主再好好想个例子吧.....
这个例子用错了.
0 请登录后投票
   发表时间:2010-06-18  
weather 写道
/**
 * 	貌似chian 写错了.
 *	chian n. 沥青,柏油.
 *	chain n. 链;束缚;枷锁.
 *  2010/06/18 14:27:45
 */

的确写错了!应该是chain!
0 请登录后投票
   发表时间:2010-06-18  
异常说得没错,你这个例子确实用错了,servlet的Filter是责任链模式,但你这个不是,你这个充其量算是Composite模式而已.
0 请登录后投票
   发表时间:2010-06-18  
引用
比如通信领域的短信验证码的获取,请求验证码---->发送验证码-----> 处理验证码----->提交验证码----->得到结果 等等的应用都和责任链模式密布可分。


我第一直觉是用State模式
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics