broadliyn
2016-03-19 15:52:04 +08:00
首先你要明白什么是责任链模式,通俗的说就是,如果当前这个请求是需要由我负责的,那么我就处理这个请求,否则我就把请求递交给下一个负责任。
这里需要明确的是,当前所处的“我”这个负责人并不需要关心上一个负责人或者下一个负责人,也就是说“我”这个负责人并不能直接与相邻的负责人进行交互。好比快递员, a 快递给 b 一件货物, a 与 b 并不是直接交接,而是 a 把快递送到物流公司,再由物流公司送到 b'手上, b'收到货物发现不是自己的,然后 b'再把快递送回物流公司,物流公司最终送到 b 手上。
而如果用继承的方式,有两个缺陷:
1.责任人之间有交互了,增加了耦合性,不符合责任链可插拔的特性。
2.责任链传递方向只能从子类到父类(通过 super.xxxChain() 方式)。而往往常见的责任链模式一般都是从头到尾,然后再从尾到头。比如 servlet 里的 filter , http request 通过 N 层的 filter 到达 servlet 后, servlet 返回的 response 也需要通过这 N 层的 filter 再返回给客户端。 netty 的 channel 、 spring 拦截器也都是这个原理。
还有一个理由也能算是缺陷, java 设计模式里一般比较忌讳继承。特别的,如果你有三个 Filter 分别是 AFilter , BFilter , CFilter , C 继承自 B , B 继承自 A ,假设中间你需要把 BFilter 给去掉,那么 CFilter 的代码就会报错,此时你就需要手动修改 CFilter extends AFilter ,因为去掉一个责任人而导致其他部分的代码也跟着需要修改,明显是不符合设计模式的初衷的。