1 解决的问题

举个例子:
菜鸟程序员只能解决简单的 bug,普通的程序员可以解决中等难度的 bug,优秀程序员可以解决困难的 bug。分配不合理的话,浪费时间 or 无法解决。

客户端通过条件判断决定使用哪个程序员

  • If 链条太多会导致太臃肿 (好像可以换 switch 解决)
  • 客户端需要知道的细节太多了,耦合严重

2 责任链模式

责任链模式就是类比链表的形式,每个对象中包含着下一个对象的引用,当当前对象无法解决问题时,调用下一个对象来进行解决。电话客服也是类似的逻辑。

当然,如果也可以转变成双向链表的形式,客户端随机选择一个对象调用方法,该对象根据情况前后传递。

也可以数组的形式来存储对象。

3 纯责任链 & 不纯责任链

  • 纯责任链 → 要么承担全部责任,要么责任推给下家,不允许在某处承担了部分或全部责任,然后又把责任推给下家;
  • 不纯责任链 → 责任在某处部分或全部处理后,还往下传递;

4 优缺点

优点:

  • 请求的发送者和请求的处理者解耦,发送者不需要知道怎么实现的;
  • 扩展性强,满足开闭原则。可以根据需要增加新的请求处理类。
  • 灵活性强。可以动态地改变链内的成员或者改变链的次序来适应流程的变化。
  • 简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的条件判断语句。
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

缺点:

  • 请求可能一直传到链的末端都得不到处理。
  • 责任链过长,处理涉及多个处理对象,性能受到影响。
  • 责任链建立的合理性要靠客户端来保证,增加了客户端的复杂性;拼接出错,出现循环情况。

5 经典应用例子

JavaEE 的 Servlet 规范定义的 Filter 就是一种责任链模式,它不但允许每个 Filter 都有机会处理请求,还允许每个 Filter 决定是否将请求“放行”给下一个 Filter