现在的位置: 首页 > 综合 > 正文

设计模式之(十四)–职责链模式(Chain Of Responsibility)

2018年05月21日 ⁄ 综合 ⁄ 共 3113字 ⁄ 字号 评论关闭

Chain of Responsibility模式定义:
为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
我的理解:
在不止一个对象可以处理客户端请求的时候,为了使每个对象都有处理请求的机会,把这些对象顺序地串联起来形成一个链,每个被串联的对象都有一个指向下一个对象的指针,当请求到来是,按照顺序,先有第一个对象来处理这个请求,这个对象有两个选择:要么处理,要么把请求传给下一个对象(每个对象都有这两个选择),就这样一直到有一个对象来处理这个请求为止,一旦有一个对象处理了这个请求就停止对请求的传递。当然也有可能到了对象链的最后,也没有一个对象来处理请求。我觉得这个与我们平常写的if…else if…else…要完成的功能太相似了。以上所说的只是Chain of Responsibility的一种情况,有的书上叫它纯职责链模式(我能处理就处理,不能处理才让别人处理),它还有另一种情况也就是不纯职责链模式(我只处理我能处理的部分,处理不了的部分再让别人来处理)。
Chain of Responsibility模式主要涉及两个角色:
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
UML如下所示:

chain

下面我举个例子:一个纯的和一个不纯的。先来个纯的:
现在的女孩子找男朋友基本上都有三个要求:有车、有房、有责任心,如果你这三样都没有,就险了。虽然我没车、也没房、但是我有责任心。^_^

 

输出结果:

我没有车

我也没有房

 

我只有一颗带Responsibility的心

模式的使用范围:
1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3) 可处理一个请求的对象集合应被动态指定。
优缺点:
1) 责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。
2) 可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。
3) 类与类之间可以以松耦合的形式加以组织。

4) 责任链模式可能会带来一些额外的性能损耗,因为它要从链子开头开始遍历。 

抱歉!评论已关闭.