23种设计模式之责任链模式

责任链模式的定义

定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止

通俗的讲, 就是将对请求的处理组成一条链, 当请求来时, 在链中依次传递, 知道找到能够处理此请求的对象

其通用类图如下:

23种设计模式之责任链模式

 

责任链模式的重点是 在"链"上, "链"由多个处理者 ConcreteHandler 组成的

Handler 抽象类代码如下:

23种设计模式之责任链模式

 

抽象的处理者实现三个职责:

  1. 定义一个请求的处理方法 handleMessage ,唯一对外开放的方法
  2. 定义一个链的编排方法 setNext, 设置下一个处理者
  3. 定义具体的处理者必须实现的两个方法, getHandlerLevel和echo

具体处理类实现抽象类的方法即可

其中涉及到的三个类:

  1. Level: 负责定义请求和处理级别
  2. Request: 负责封装请求
  3. Response: 负责封装链中返回的结果

场景类代码如下:

23种设计模式之责任链模式

 

在实际应用中, 一般会有一个封装类对责任链进行封装, 直接返回链中的第一个处理者, 具体链的设置不需要高层模块关心, 这样, 更简化了高层模块的调用, 减少模块间的耦合, 提高系统的灵活性

责任链模式的应用

1.责任链模式的优点

责任链模式非常显著的优点就是将请求和处理分开.请求者可以不用知道是谁处理的, 处理者可以不用知道请求的全貌, 两者解耦, 提高系统的灵活性

2.责任链模式的缺点

  1. 性能问题, 每个请求都是从链头遍历到链尾, 特别在链比较长的时候, 性能是一个非常 大的问题
  2. 调试不很方便, 特别是链条比较长,环节比较多的时候, 由于采用了类似递归的方式, 调试的时候逻辑可能比较复杂

3.责任链模式的注意事项

链中节点数量需要控制,避免出现超长链的情况, 一般的做法是在Handler中设置一个最大节点数量, 在setNext方法中判断是否已经超出其阈值, 超过则不允许该链建立, 避免无意识的破坏系统性能


在上面的例子中, 融合了模板方法模式, 通过融合模板方法模式, 各个实现类只要关注自己的业务逻辑就成了, 至于什么事要自己处理, 就让父类去决定好了, 也就是说父类实现了请求传递的功能, 子类实现请求的处理, 符合单一职责原则, 这样, 子类的实现非常简单, 责任链的建立也非常灵活.

23种设计模式之责任链模式

全文结束