责任链模式的应用实例

 

 

    对于一般的程序员而言,在平时的coding当中并没有刻意去应用什么模式。但最近我的一个体会就是,当你发现已完成功能的实现代码,其侵入性非常之高;再从软件产品整体的角度去俯瞰,该部分代码甚至已经完全不符合OCP、SRP等原则了,需求稍有变更,就需要有伤筋动骨的改动,从而导致开发的工作量变得繁多而复杂。

 

    这就是软件设计和实现不合理所造成的困扰。其实际来源于是我最近做的一个银行业务软件产品,具体情形可概述为:当一个web请求到达的时候,去执行逻辑1,得到结果1;再根据结果1,执行逻辑2,得到结果2,……依次执行,最后得到结果N,也就是最终结果。

 

    就是这个流程,写在了一个主方法中,从逻辑1至逻辑N,依次执行。都封装在一个方法里,对于主类,其职责不单一;其次,改动也会影响主类,代码体验相当不好。其实解决耦合度的难点在于执行逻辑2是依赖或者不依赖逻辑1的执行结果的,而且从逻辑1到逻辑N,会在其中的某个逻辑返回结果。

 

    责任链模式刚好能够解决这个场景。启发来源于struts2/webwork的Interceptor:就struts2的Action的职责层面而言,需要在Action这个层面上完成的职责很多,因此通过Interceptor将职责进行合理的分类和排序,将他们组织成有序的执行队列。struts2中使用了一种类似责任链的设计模式对这些不同的职责进行分类并串联起来,从而使得Action层具备了丰富的层次结构。而在这个执行队列中的每个元素,就被我们称之为Interceptor,也就是拦截器。 

 

    而具体到这个软件产品中,将具体要执行的逻辑1,逻辑2,……逻辑n视为command,用一个命令链给它们穿起来。但是还需要提供每一个command执行之后的上下文context。而上述需求,适用org.apache.commons.chain,就能够完全实现。

 

    主类如下:

 

命令链Tx102010Chain将各种command加载到链中:

 

具体命令执行的业务逻辑举例如下:

 

责任链模式,只是一根绳子,它不能够处理并行的请求。

 

责任链模式教学代码如下:

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值