前言
很多框架如mybatis的插件,servlet的filter,dubbo,安全框架诸如Spring security、apache shiro都会用到设计模式中的责任链模式,所以学习责任链模式成为帮助你学习以上这些框架的一个好的手段之一。今天我们就来了解一下责任链模式。
定义
如果有多个对象(Handler)都有机会处理数据源(RequestSource,这里不是单纯的数据库数据源,可以是一个请求,总之是来源),责任链可以使数据的发送者和接收者解耦,数据沿着责任链传递,直到有一个对象处理了它为止。
上去形成了一条流水线的链条,所以称之为责任链,但是不仅仅局限于链条,还可以成树形或者环形,这取决于你的业务设计。
场景
插件设计、拦截器、过滤器等一些针对切入点的特定链式处理。都可以使用责任链模式。
两种实现方式
两种方式的不同主要是定义处理链的顺序和结构的不同,接下来我们来看看这三种方式。
通过处理器集合来定义处理顺序
好处在于可以集中管理处理器,指责单一。非常容易理解,容易实现。缺点是如果新增处理器(Handler)势必影响已有的处理器,只能顺序执行。处理流程是这样的:
接下来用代码来实现一下此模式:
HandlerChain 负责维护调用链条的顺序,这里默认实现用List来管理Handler
1 | public interface HandlerChain { |
Handler是处理链的节点抽象,是数据源(RequestSource)的具体处理者,它负责对数据的处理以及决定是否进入下一个Handler。
1 | public interface Handler { |
利用链表的指针特性
这里利用了链表的一部分特点,通过在当前的Handler指定下一个Handler来作为指针,相比较上面而言,Handler更自治,在节点的处理上更加灵活。
Handler负责指针以及逻辑处理:
1 | public interface Handler { |
总结
责任链模式在各种常见框架中非常常见。所以建议各位在对此设计模式进行认真学习