从开源框架理解设计模式系列#Chain Of Responsibility责任链模式

责任链模式是一种设计模式,用于在多个对象中传递请求,允许对象自行决定是否处理请求。SpringMVC的HandlerExecutionChain、Tomcat的ApplicationFilterChain和Dubbo的Filter链都是责任链模式的实例。该模式减少了发送者和接收者之间的耦合,但也可能导致调试困难和性能问题。
摘要由CSDN通过智能技术生成

目录

what什么是责任链模式

why为什么需要责任链模式

how如何实现责任链模式        

开源框架经典案例

SpringMVC中的的HandlerExecutionChain

Tomcat处理Serlvet的ApplicationFilterChain链

Dubbo中的Filter链

使用场景

优缺点对比

优点

缺点

参考资料


what什么是责任链模式

        Gof定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

        HeadFirst定义:当想让一个以上的对象有机会处理某个请求的时候,就使用责任链模式。

why为什么需要责任链模式

        通过责任链模式,我们可以爲某个请求创建一个对象链。每个对象依次检查该顺序,并对其进行处理,或者将其传给链中的下一个对象。

        在很多复杂的框架中,一个请求从入到出比如会经过很多的步骤和环节,而有的步骤其实内部处理的输入输出都类似,只是逻辑不一样而已,因此,责任链模式再适合不过了。

        责任链的核心是这个链,也就是说在一个链上面有相似的请求模式,可以想象成生产汽车的流水加工线,假设需要生产特斯拉,汽车有1w个零件,每个零件就是一个链,一个链处理一件事情,有的往车上加轮胎,有的往车上加引擎,最终一辆汽车就产生了。如果没有责任链,那么会出现一个问题是所有的事情都在一起执行,而这可能是不同的团队不同车间做的事情。

how如何实现责任链模式        

        职责链模式主要包含以下角色。

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。


                责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

责任链模式的结构图


责任链模式的结构图


 

责任链

开源框架经典案例

SpringMVC中的的HandlerExecutionChain

        对Serlvet了解的同学会知道,Listener、Filter、Intercetor是几个常用组件,这里具体作用我就不详细描述了,基本都是主逻辑的辅助组件。我们重点关注SpringMVC中有interceptor、SpringMvc在处理一个request的时候,都会先走一个HandlerExecutionChain,这个执行链里面是由很多个Interceptor组成的,而每一个Interceptor都有几个核心方法,分别是preHandle、postHandle、afterCompletion。

        所有注册了的Interceptor都会被加载到HandlerExecutionChain中,因此我们也可以自定义拦截器做一些通用操作,比如线程变量的初始化、日志的打印、参数的校验等等。

        先看一下HandlerExecutionChain的结构,其中数组interceptors和列表interceptorList的区别是什么,这里我认为是为了更好的构建interceptors,因为数组操作没有interceptorList方便,因为在外部只用到了interceptors。


/**
   Hanlder处理链,由handler interceptor组成
 * Handler execution chain, consisting of handler object and any handler interceptors.
 * Returned by HandlerMapping's {@link HandlerMapping#getHandler} method.
 *
 * @author Juergen Hoeller
 * @since 20.06.2003
 * @see HandlerInterceptor
 */
public class HandlerExecutionChain {

	private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);

	private final Object handler;

	pri
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值