/************************************************************************************************** |
责任链: 解除请求的发送者和接收者之间的耦合,而使多个对象有机会处理这个请求。将这些请求连成一个链,并沿着这条链传递该请求,直到有个对象处理它(诸多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受)。
§ 场景1
手机平台系统常有提供对手机日程、电话、短信、通话记录等信息的备份,通常应用平台会提供可选择备份项的UI给用户,变化部分主要有以下几点:
1、 系统增加或删除备份项目
2、 用户可选择备份、还原项不固定,致使应用无法良性的判断该执行哪些备份
代码示例:
http://download.csdn.net/download/webwalker/7470265
//create handler instance
BaseHandler h1 = new AgendaHandler();
BaseHandler h2 = new CallHandler();
BaseHandler h3 = new PhoneHandler();
BaseHandler h4 = new SmsHandler();
//set next chain node
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);
h3.equals(h4);
//process request
List<String> checkedList = this.GetCheckedListItem();
h1.Handle(checkedList);
§ 场景2
类似Work flow中面向流程性的处理方案也是一个很好的选择,关于WF这里不在赘述。在面向这种流程性事务处理过程中,简单的说就是你有很多业务,这些业务都有各自的业务处理流程,且这些流程有很多相同的事务处理逻辑,则大可通过将每个主要的业务流程作为一个处理Step、一个链节点,通过配置链节点的先后顺序,来完成一系列业务逻辑的执行过程。而各个节点或事务step可通过上下文实现数据共享与串联(对链中各环节存有共性、异性的地方进行变化封装,而后与主链进行衔接)。
§ 场景3
增值业务中,常有提供规则设置UI给使用者,以便使用者可以委托付款周期、自动充值(按天、按周、按月、按年、按小时)、自动提现等,当然每部分需采用不同的算法策略。在此基础上,主要的变化部分如下:
1、 每个商户可设置的规则类型不固定
2、 每个商户可设置的规则个数不固定
3、 每个商户设置的时间点不固定
通过链接的方式完成不同过则的自动匹配与处理较佳!
§ 总结
除了以上显示的设置链条的节点外,还可采用隐式的方式实现链条节点的自动切换。(也即通过提供统一的抽象方法或接口,实现获取下一个链节点接收对象,在内部完成链节点的切换),另外,针对策略的不同情况,适当时候我们还可以增加针对策略的接口,提供策略可执行判断、不同策略待验证项等等。