码迷,mamicode.com
首页 > 其他好文 > 详细

第15章 行为型模式—职责链模式

时间:2016-06-10 10:59:45      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

1. 职责链模式(Chain Of Responsibility)的定义

(1)定义

  使多个对象都有机会处理请求,从而避免请求的发送者接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

  ①标准的职责链模式中,只要有对象处理了请求,这个请求就到此为至,不再被传递和处理了。

  ②但也可以变形使用职责链,就是让这个请求继续传递,每个职责对象对这个请求进行一定的功能处理,从而形成一个处理请求的功能链。

  ③当客户端发出请求,它并不知道谁会真正处理他的请求。在职责链模式中,请求不一定会被处理,因为可能没有合适的处理者,这里可以在职责链的末端加一个默认处理的职责对象。

  ④职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。

(2)职责链模式的结构和说明

技术分享

  ①Handler:定义职责的接口,通常在这里定义处理请求的方法,可以在这里实现后继链(successor)

  ②ConcreteHandler:实现职责的类,在这个类中,实现对它职责范围内请求的处理,如果不处理,就继续转发请求给后继者。

  ③Client:职责链的客户端,向链上的具体处理对象提交请求,让职责链负责处理。

【编程实验】HR系统中的审批流程

 

(3)思考职责链模式

  ①职责链的本质分离职责,动态组合。分离职责是前提,动态组合才是职责链模式的精华所在,因为这意味着可以很方便地修改和添加新的处理对象,从而让系统更加灵活和具有更好的扩展性。

  ②职责链的动机:在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时需要有接受者,如果显式指定,将必不可少地带来请求发送者与接受者之间的紧耦合。而职责链模式可以将这两者解耦,使得发送者不必知道具体的接受者(处理者)

2. 功能链(如过滤器)

(1)概念:实际开发中,经常将一个请求在职责链中传递,每个职责对象负责处理请求的某一方面的功能,处理完后不是停止,而是继续向下传递请求,当请求通过很多职责对象处理后,功能也就完成了,把这样的职责链称为功能链。

(2)应用举例

  ①实际开发中,在业务处理之前,通常需要进行权限检查、数据校验、逻辑检查等,然后才开始真正的业务逻辑。可以把这些功能分散到一个功能链中。

  ②过滤器:每个过滤器负责自己的处理,然后转交给下一个过滤器,直到把所有的过滤器都走完(如权限检查、字符转换等)。

【编程实验】字符过滤器

 

3. 职责链的优缺点

(1)优点

  ①请求者和接收者的松散耦合

  ②动态组合职责:职责链模式把功能处理分散到单独的职责对象中,然后在使用的时候可以动态组合职责形成职责链,从而可以灵活地给对象分配职责,也可以灵活地实现和改变对象的职责。

(2)缺点

  ①产生很多细粒度对象

  ②不一定能处理:职责链模式的每个职责对象只负责自己处理的那一部分,因此可能会出现某个请求在整个链中找到不处理的合适对象。这就需要在使用职责链模式的时候,提供默认的处理,并且注意构建的链的有效性。

  ③性能问题:每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。

  ④调试不方便,特别是链条比较长时,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

4. 职责链的应用场景

(1)UI中处理用户事件,当用户点击鼠标或按键盘,一个事件产生并沿链传播。

(2)过滤器

(3)人事管理系统中的请求、审批流程管理

(4)有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

(5)如果不想明确指定接收者,向多个对象中的其中一个提交请求。

(6)动态指定一个请求的处理对象集合,在运行时动态地决定到底由哪些对象参与到处理请求中来。

5. 相关模式

(1)职责链模式和组合模式

  ①两个模式可以组合使用,可以把职责对象通过组合模式来组合,这样可以通过组合对象自动递归地向上调用,由父组件作为子组件的后继,从而形成链。

  ②这时,客户端使用时就不再需要构造链了(但需要构造组合对象树)。

(2)职责链模式和装饰模式

  ①这两个模式相似,从某个角度讲,可以相互模式实现对象的功能。

  ②装饰模式能够动态地给被装饰的对象添加功能,要求装饰器对象和被装饰器对象实现相同的接口。而职责链模式可以实现动态的职责组合标准处理是有一个对象处理就结束,但如果处理完本职责不急于结束,而是继续向下一个后继传递请求,那就和装饰器模式的功能差不多了,每个职责对象就类似于装饰器。

  ③主要区别:装饰模式是无限递归调用,可以有任意多个对象来装饰功能,但职责链模式是有一个处理就结束。

第15章 行为型模式—职责链模式

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5573318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!