责任链模式的定义
定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止
通俗的讲, 就是将对请求的处理组成一条链, 当请求来时, 在链中依次传递, 知道找到能够处理此请求的对象
其通用类图如下:
责任链模式的重点是 在"链"上, "链"由多个处理者 ConcreteHandler 组成的
Handler 抽象类代码如下:
抽象的处理者实现三个职责:
- 定义一个请求的处理方法 handleMessage ,唯一对外开放的方法
- 定义一个链的编排方法 setNext, 设置下一个处理者
- 定义具体的处理者必须实现的两个方法, getHandlerLevel和echo
具体处理类实现抽象类的方法即可
其中涉及到的三个类:
- Level: 负责定义请求和处理级别
- Request: 负责封装请求
- Response: 负责封装链中返回的结果
场景类代码如下:
在实际应用中, 一般会有一个封装类对责任链进行封装, 直接返回链中的第一个处理者, 具体链的设置不需要高层模块关心, 这样, 更简化了高层模块的调用, 减少模块间的耦合, 提高系统的灵活性
责任链模式的应用
1.责任链模式的优点
责任链模式非常显著的优点就是将请求和处理分开.请求者可以不用知道是谁处理的, 处理者可以不用知道请求的全貌, 两者解耦, 提高系统的灵活性
2.责任链模式的缺点
- 性能问题, 每个请求都是从链头遍历到链尾, 特别在链比较长的时候, 性能是一个非常 大的问题
- 调试不很方便, 特别是链条比较长,环节比较多的时候, 由于采用了类似递归的方式, 调试的时候逻辑可能比较复杂
3.责任链模式的注意事项
链中节点数量需要控制,避免出现超长链的情况, 一般的做法是在Handler中设置一个最大节点数量, 在setNext方法中判断是否已经超出其阈值, 超过则不允许该链建立, 避免无意识的破坏系统性能
在上面的例子中, 融合了模板方法模式, 通过融合模板方法模式, 各个实现类只要关注自己的业务逻辑就成了, 至于什么事要自己处理, 就让父类去决定好了, 也就是说父类实现了请求传递的功能, 子类实现请求的处理, 符合单一职责原则, 这样, 子类的实现非常简单, 责任链的建立也非常灵活.