目录
- 处理过程
- 应用场景
- 参与者
- 协作
- 效果
- 实现
- 相关模式
- 应用与思考
- 类图
职责链(Chain of responsibility)是一种对象行为模式,可以使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
处理过程
从第一个对象开始,链中收到请求的对象要么亲自处理他,要么转发给链中的下一个候选者。提交请求的对象并不明确知道哪一个对象将会处理它
应用场景
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
- 想在不明确指定接收者的情况下向多个对象中的一个提交一个请求
- 可处理一个请求的对象集合应被动态指定
参与者
- Handler:定义一个处理请求的接口
- ConcreteHandler:
- 处理它所负责的请求
- 可访问它的后继者
- 如果可处理该请求,就处理之;否则将该请求转发给它的后继者
- Client:向链上的具体处理者对象提交请求
协作
当客户提交一个请求时,请求沿着传递链直至有一个ConcreteHandler对象负责处理它
效果
- 降低耦合度:该模式使得一个对象无需知道哪一个对象处理其请求。职责链可简化对象间的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用
- 增强了给对象指派职责的灵活性:可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。可以将这种机制与静态的特例化处理对象的继承机制结合起来使用——什么是静态的特例化处理对象的继承机制?
- 不保证被接收和处理
实现
- 实现后继者链,有两种方式实现后继者链:
- 定义新链接,通常在Handler中定义,但也可由ConcreteHandlers来定义
- 使用已有的链接,如在一个部分整体层次结构中,父构件应用可定义一个部件的后继者——待验证
- 连接后继者:client中的handler变量需要指向第一个Concretehandler1的指针实例,ConcreteHandler1中需要保存ConcreteHandler2中的指针实例,以此类推
- 表示请求:可以用硬编码,或者请求函数,封装请求对象等
相关模式
- 与Composite一起使用,这种情况下一个构件的父构件可以作为它的后继——待验证
应用与思考
- 在涉及到对请求或命令进行处理时可以采用职责链模式,这种场景下和状态模式有什么区别?
- 如果不使用职责链模式,client中将使用大量的ConcreteHandler对象;使用职责链之后,只需要保存一个handler对象,但每个ConcreteHandler需要保存下一个ConcreteHandler对象