先来看一个案例:
上述案例在现实生活中更像是一种"推卸责任"的行为,但在编程世界中,我们也许需要这种"推卸责任"的模式。这就是我们接下来要讨论的责任链模式(Chain of Responsibility )。
什么是责任链模式?
责任链模式中的角色:
- Handler:表示处理器这一类角色,它声明了处理请求的接口(API),并且知道当自己解决不了问题时,应该委托给下一个处理器。
- ConcreteHandler:表示具体的处理器,实现了Handler中声明的抽象方法。
- Client:请求发起者,即向第一个ConcreteHandler发起请求的角色。
责任链模式的类图:
我们来编写一个示例程序:
1、创建一个表示问题的类
2、编写一个表示Handler的类
这是一个抽象类,next属性是责任链中相对一自己的下一个处理器,support方法是对外开放的用于处理问题的方法,在其内部调用了resolve方法,resolve方法的有子类处理器提供具体的实现。
3、编写表示ConcreteHandler角色的类
这里提供了4个用于处理特定问题的处理器
4、编写测试程序
TestDemo实际上充当了Client的角色
结果如上图所示,在一条责任链中,若当前处理器无法处理请求,它会委派给下一个处理器,当最后一个处理器都不能解决问题,则会打印错误信息。
最后小结:
1、责任链模式弱化了发起请求的人与处理请求的人之间的关系
2、责任链模式实际上使得各个处理器的职责更加明确,而非真正的推卸责任
责任链上的每一个处理器都只专注于自己能够解决的问题,对那些自己处理不了的问题,会毫不犹豫(带感情色彩)地委托给下一个处理器。
3、责任链模式一定程度上造成延时
相比于请求人与处理人一一对应的情况来说,请求在责任链上传播,会延迟了请求的处理,当然这需要根据具体情况去权衡,在请求人与处理人关系明确且需要快速处理请求的情况下,不推荐使用责任链模式。
Ending ...