1、提取责任链模式的藕和丝
设计模式之责任链模式:使用“藕断丝连”的设计哲学去解释,“请求的发送”和“请求的接收”是2节藕,而handlerChain是丝。
这是我在工作和学习中总结的设计最高要义:“藕断丝连”。
2、责任链模式的设计要义
将框架级别的代码抽象到抽象类之中,将具体逻辑下放给不同的逻辑单元。责任链可以使用数组或者链表来实现,维护责任链的工作包括新增节点,触发链上的工作。
责任链模式各“逻辑单元”被维护在数组中或者链表中,一个某个逻辑单元已经成功处理了“请求”,那么就停止请求在“责任链”上的流动,这是常规的使用办法。
责任链模式还有另一种处理模式,即通过递归调用时责任链上的所有“逻辑单元”都处理一遍“请求”。
前者是成功即停止,后者是“雨露均沾”。
3、责任链模式的经典应用
哪些框架或者现有的产品使用了责任链模式呢?
servlet Fliter 和sping Interptor都使用了责任链模式,Netty中的ChainPipeline也使用的责任链模式,而且它的责任链是使用链表实现的,不仅可以在头部或者尾部添加Handler节点,还提供在某个现有节点的前面或者后面插入新的节点,为使用者组合“逻辑单元”提供了灵活性。 据说Dubbo Filter也使用了责任链模式,目标还没有学到Dubbo框架,后边遇到时重点关注一下其中的责任链模式是如何实现的。Mybatis的二级缓存和插件的组织均使用了责任链模式,Mybatis的二级缓存中使用责任链模式既没有使用数组,也没有可见的容器(链表),而是与装饰器模式一起使用,有点像直接构建链表,我们看到的下一个节点持有上一个节点的引用,,这一个是比较典型的责任链模式!