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

来源:互联网 发布:总做白日梦知乎 编辑:程序博客网 时间:2024/06/05 19:25

第一种方式:
实现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相关代码学习。

阅读全文
0 0
原创粉丝点击