责任链的三种实现方式比较

本文探讨了责任链模式的三种不同实现方式。第一种方式是通过列表顺序执行handler,直观但不够灵活。第二种方式将handler链交由context管理,允许在任意位置调用下一个handler,灵活性提升但链只能使用一次。第三种方式采用链表结构,能多次调用后续handler,如Netty的实现,虽然更复杂,但提供了更多的操作可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种方式:
实现handlerChain,handlerChain里面用一个列表保存所有的handler。
优点:直观。
缺点:只能顺序执行,前一个handler逻辑完全跑完了,再跑下一个逻辑。
例子如下:
这里写图片描述

第二种方式:
将handler链交给context保管,spring的责任链,web的listener链都是基于这种方式实现,类似于DFS。
优点:可以在前一个handler的任意地方调用下一个handler,逻辑调用更加灵活。
缺点:由于依旧通过数组来保管handler,责任链只能使用一次。
这里写图片描述
客户端通过context.proceed()来指明何时在一个handler里面调用下一个handler逻辑。如下图所示,实现了先调用后面handler逻辑,返回后再调用本身逻辑的功能。
这里写图片描述
第三种方式:
将handler链交给context保管,handler链是一个链表,而不是数组,有默认的handler作为责任链的起始,结束的标志,可以方便的找到下一个handler然后调起。netty基于这种方式实现其责任链。
优点:能够多次调用后面handler逻辑,比如在一个handler里面随时多次通过调用fireEvent()方法把事件传下去,让责任链后面的handler逻辑先执行。而第二种就只能传一次事件,让责任链后面的handler逻辑先执行。
缺点:复杂,责任链维护诸如默认handler,指针等变量有更大的空间复杂度。
示例可以找netty4相关代码学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值