定义:
将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者。沿着这条链进行请求,直到有对象处理它为止。
结构图:
- Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子类中实现。同时持有一个其后续责任类的引用(successor),如果该请求能够被处理,则处理返回;如果不能被处理则转发给后续责任类进行处理。
- ConcreteHandler:具体处理类,实现了具体处理请求的业务方法。首先应当判断是否具体处理该类的权限,如果有则进行处理,如果没有则转发给继任者。
注意:
- 责任链模式并不创建责任链,而是通过其他模式来进行构件,比如使用建造者模式。
- 单纯的责任链模式有两个要求:一是该请求要么完全由自己处理,要么完全由继任者处理;二是要求该请求必需被一个Handler处理。
- 不单纯的责任链模式,则不要求上述两个条件。它既可部分由当前类处理,再由继任者处理剩余部分;也可以由继任者重复处理。而且一个事件可以最终不被任何处理者对象接收。
优点:
- 被处理的对象无需知道具体被谁处理,不需要知道责任的之间的结构,降低了系统间的耦合。
- 一个请求处理对象只维护了一个后继者的引用,不需要引用其他所有责任类,如果不能处理直接抛给后继者,降低了责任之间的关联度。
- 可以动态地添加或者删除责任链,改变一个请求的处理过程,符合“开闭原则”。
缺点:
- 如果链较长,则有可能严重影响系统性能,并导致方法调用栈过大。
- 如果配置不当,很有可能会产生循环链。
适用场景:
- 有多个对象可以处理同一请求,而具体哪个对象处理由运行时决定,而被处理的对象不需要关心谁处理。
- 可以动态地指定一组请求处理类,并且可以动态的管理这些类。
实例: