关闭

深入浅出基于Java的责任链模式

发表于:2010-12-31 09:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  下面的例子就是采用了上面提到的“不纯的责任链模式”。

  四、举例

  这个例子来源于项目中我刚刚完成的一个小功能点——“代号自动生成器”。在项目中存在很多地方,比如:员工工号、档案代号,要求客户在使用时输入。而这些代号对于一个特定的企业或者类别,往往有一定的规则。因此可以让用户在系统参数中维护一定的规则,然后通过“代号自动生成器”来给用户生成代号。

  根据初期需求,用户代号中往往存在以下几种变动元素:年份、月份、日期、流水号。由于需求比较简单,因此考虑到用户可能存在其他变动元素,所以我打算在“被第一颗子弹击中”后重构一下现有的结构。下面就是我在头脑中演绎过的使用责任链模式的重构。

  这里只用来说明下责任链模式的结构和使用,因此不体现功能细节。

//这是抽象处理者角色

public interface CodeAutoParse {

 //这里就是统一的处理请求使用的接口

 String[] generateCode(String moduleCode, int number, String rule,String[] target) throws BaseException;

}

//这个为处理日期使用的具体处理者

public class DateAutoParse implements CodeAutoParse{

 //获取当前时间

 private final Calendar currentDate = Calendar.getInstance();

 //这里用来注入下一个处理者,系统中采用的是Spring来管理的

 private CodeAutoParse theNextParseOfDate;
 public void setTheNextParseOfDate(CodeAutoParse theNextParseOfDate){
this.theNextParseOfDate = theNextParseOfDate ;
 }

 /*
 *实现的处理请求的接口
 *这个接口首先判断用户定义的格式是否有流水号,有则解析,没有则跳过
 *下传到下一个处理者
 */

 public String[] generateCode(String moduleCode, int number, String rule, String[] target)
throws BaseException {
 //这里省略了处理的业务
 ……
 if(theNextParseOfDate != null)
return theNextParseOfDate.generateCode(moduleCode , number , rule, target)
 else
return target;
 }

  其它具体处理者也是如此的结构,每一个里面都设置有一个用来存放下一个处理者的引用,不管你有没有下一个处理者。

  其实责任链模式本身的结构和使用都没有什么,就是一个继承或者实现。在处理请求的时候,按照规定去调用下一个处理者。但是怎么来维护这样一条链子呢?

  《设计模式》一书中仅仅说必须自己引入它,可以参考使用list或者map来进行注册。而在上面我使用spring来管理具体处理者角色的引入。当有了新的处理者需要添加的时候,仅仅需要修改下配置文件。

  五、其他

  责任链模式优点,上面已经体现出来了。无非就是降低了耦合、提高了灵活性。但是责任链模式可能会带来一些额外的性能损耗,因为它要从链子开头开始遍历。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号