标签:
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)职责链模式和装饰模式
①这两个模式相似,从某个角度讲,可以相互模式实现对象的功能。
②装饰模式能够动态地给被装饰的对象添加功能,要求装饰器对象和被装饰器对象实现相同的接口。而职责链模式可以实现动态的职责组合,标准处理是有一个对象处理就结束,但如果处理完本职责不急于结束,而是继续向下一个后继传递请求,那就和装饰器模式的功能差不多了,每个职责对象就类似于装饰器。
③主要区别:装饰模式是无限递归调用,可以有任意多个对象来装饰功能,但职责链模式是有一个处理就结束。
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5573318.html