责任链模式(Chain of Responsibility Pattern)

一、概念

责任链模式(Chain of Responsibility Pattern)是指将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且每个节点内部自动维护了一个下一个节点对象。当一个请求在链路的头部发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。

  • 责任链模式通常会维护一个单向链表,将同一类请求的对象连成一条链,调用方只需要调用头部节点就可以了,所提交的请求会沿着链传递,由链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理

二、适用场景

  1. 一个请求需要多个操作或对象依次处理,形成一条处理链路,常见如:拦截器、过滤器
  2. 多个对象可以处理同一请求,将这些对象连成一条链,并沿着这条链传递该请求,具体由哪个对象处理则在运行时动态决定。
  3. 责任链模式一般用于处理流程流转相关的业务场景,如:请求审批流程、报销流程、接口校验流程

三、参与者

  • 抽象处理者(Handler)定义一个请求处理的方法,并维护一个下一个处理节点的Handler对象
  • 具体处理者(ConcreteHandler)在实现Handler的处理方法中对请求进行处理,处理完之后可以进行转发
  • Client 用户

四、代码例子

 假设我们工作中花费了一笔费用需要报销,提交费用报销单时首先由直属上级领导审批是否可以报销,如果额度超了权限这个报销单就会传到再上一级领导,直到有人接收处理。

  • 抽象处理者(Handler):AbstractManager
  • 具体处理者(ConcreteHandler):JuniorManager、IntermediateManager、SeniorManager

五、UML图

 

 

六、优缺点

(一)优点

  1. 将请求与处理解耦,请求处理者(链路中的节点)只需关注自己感兴趣的请求进行处理,对于不感兴趣或者无法处理的请求直接转发给下一个处理者
  2. 具备链式传递请求的功能,请求发送者不需要知道链路结构,只需等待请求处理结果
  3. 链路结构灵活,可以通过改变链路结构动态的新增或者删减链路节点
  4. 易于扩展新的请求处理类,符合开闭原则

(二)缺点

  1. 请求都是从链头遍历到链尾,如果责任链的链路太长或者处理时间过长,会影响性能。
    • 一般我们可以在 Handler 中"设置一个最大节点数量",在setNext方法中判断是否已经超过最大节点数,超过则不允许继续添加处理者,避免无意识的破坏系统性能。
  2. 如果节点对象存在循环引用时,会造成死循环,导致内存溢出
posted @ 2022-12-12 14:30  ImreW  阅读(59)  评论(0编辑  收藏  举报