责任链模式的定义
定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止
通俗的讲,就是将对请求的处理组成一条链,当请求来时,在链中依次传递,知道找到能够处理此请求的对象
其通用类图如下:

责任链模式的重点是 在"链"上,"链"由多个处理者 ConcreteHandler 组成的
Handler 抽象类代码如下:

抽象的处理者实现三个职责:
- 定义一个请求的处理方法 handleMessage,唯一对外开放的方法
- 定义一个链的编排方法 setNext,设置下一个处理者
- 定义具体的处理者必须实现的两个方法,getHandlerLevel和echo
具体处理类实现抽象类的方法即可
其中涉及到的三个类:
- Level: 负责定义请求和处理级别
- Request: 负责封装请求
- Response: 负责封装链中返回的结果
场景类代码如下:

在实际应用中,一般会有一个封装类对责任链进行封装,直接返回链中的第一个处理者,具体链的设置不需要高层模块关心,这样,更简化了高层模块的调用,减少模块间的耦合,提高系统的灵活性
责任链模式的应用
1.责任链模式的优点
责任链模式非常显著的优点就是将请求和处理分开.请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性
2.责任链模式的缺点
3.责任链模式的注意事项
链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在setNext方法中判断是否已经超出其阈值,超过则不允许该链建立,避免无意识的破坏系统性能
在上面的例子中,融合了模板方法模式,通过融合模板方法模式,各个实现类只要关注自己的业务逻辑就成了,至于什么事要自己处理,就让父类去决定好了,也就是说父类实现了请求传递的功能,子类实现请求的处理,符合单一职责原则,子类的实现非常简单,责任链的建立也非常灵活.