java面试

责任链模式

2018-06-21  本文已影响1人  土豆有点

1 什么是责任链模式?
现在模拟一个场景:你是个高中生,有4个小弟A、B、C、D,分别擅长语文、数学、英语、物理,在每次考试中,他们都正好坐在你后面一排,你根据不同的科目把试卷传给相应的小弟,他就会帮你答题,就像下面这样:

image.png
这种方式的特点是:(1)你得记住每个小弟擅长哪一科;(2)你和每个小弟都得有联系。放到代码里,“你”和“小弟”之间的耦合度就太高了,如果小弟流动性比较高,岂不是要经常修改“你”,如果项目大一点儿,这种维护工作是很费力不讨好的。

我们用责任链来优化一下,哪有老大这么操心的,这种事完全可以交给秘书去做嘛,你可以从四个小弟中挑一个秘书(比如你看上了A),以后不管考什么,你都只管把卷子递给A,他如果处理不了,就转交给B,以此类推,直到有人能处理或所有人都处理不了。
或者再优化一下,添加两个专职秘书DebugHandler(放在责任链的开始,专门负责传递试卷并写日志)和FinalHandler(放在责任链末尾,如果有未处理的任务,就抛异常)。为了使用尽量简单的代码说明问题,下文中的代码均只包含图中的实线路径。

image.png
我们观察一下上图,责任链模式的优缺点就显而易见了:

优点:解藕了请求发送者和N个接收者之间的关系,请求发送者只需要记住第一个节点即可。
缺点:每发送一次请求,都只有一个节点有实质作用,它之前节点的作用仅仅是让请求传递下去,从性能方面考虑,我们要避免过长的责任链带来的性能损耗。

参考

(http://aes.jypc.org/?p=10268)

上一篇下一篇

猜你喜欢

热点阅读