责任链在框架中随处可见,比如:拦截器,过滤器等等,
1.责任链模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。简单总结就是:将处理不同逻辑的对象连接成一个链表结构,每个对象都保存下一个结点的引用。责任链模式又称“踢皮球模式”
2.责任链的实现原理:
责任链分为单项责任链和双向责任链(执行闭环)
单行责任链:
他结构式设计一个单项列表上下文Context,然后去保存链表的头(head)和链表的尾(tail),然后再上下文加入handler,也就是处理业务逻辑的节点类,每个handler都保证了下一个执行结点的引用,形成一个完整的执行来链路,我们在J2EE标准中,比如Filter过滤器以及spring的Intercetor的拦截器都是采用这种单项责任链来设计
双向责任链是如何设计:他和单项差不多,他只是在handler上增加了一个对上一个节点的引用,这样责任链就形成了一个执行闭环。在Netty种这个piepline管道他就采用双向责任链
责任链模式一般还会结合建造者模式来使用,来实现链式编程
3.责任链的优缺点:
优点
责任链解决了将请求和处理完美的解耦
请求处理者只需要关注自己职责范围内的请求,对于不是自己职责范围内的请求可以直接转发到下一个节点对象
它具备链式存储传递处理请求的功能,请求发送这不需要知道链路结构,只需要去等待请求结果就可以了
链路结构比较灵活,它可以动态新增或删除责任
缺点
如果连路太长或者处理请求太久,它会影响程序的整个执行性能
如果节点对象存在循环引用,可能会造成死循环,从而导致程序崩溃。