简述:
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
结构图:
实例:
责任链模式存在以下两种情况:
-
纯的职责链模式:
一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理(承担责任);把责任推给下家处理。
- 不纯的职责链模式:
允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况,且一个请求可以最终不被任何接收端对象所接收。
优点:
-
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它,这样做的好处是请求者不用管哪个对象来处理,反正该请求会被处理就对了。
-
接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。这也就大大降低了耦合度了。(简化了对象:使得对象不需要知道链的结构; 降低耦合度:将请求的发送者和接收者解耦)
-
增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
缺点:
-
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,这就很糟糕了
-
如果责任链的链路太长或者处理时间过程,会影响性能
-
如果节点对象存在循环引用时,会造成死循环,导致系统崩溃
使用场景:
责任链模式主要是解耦了请求与处理,用户只需要将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点进行处理。可以适用于如下场景:
-
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定
-
在不明确指定接收者的情况下,向多个对象中的一个提交请求
-
可以动态指定一组处理对象的处理请求