Java设计模式十九——责任链模式

责任链模式 老李的苦恼

每个人在出生的时候,都早已在暗中被标好了三六九等。

老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事。在他们的心中,谁当老爷都没有区别,世界发展如何也与他们无关,只要包工头能按时发工资,只要小家平安无事就够了,平时受点欺负,累点苦点也没办法,能忍则忍了。

并不是你安分守己,世界就会给你公平公正,社会它牢记着你的出身。

老李最近遇到了一件糟心事,起因是在工地干活的时候,被钢管砸断了鼻梁骨和颧骨,流了一个多小时血,才送到医院,包工头交了医疗费后就不再过问,老李在医院做手术加恢复总共就住了一个星期,还在流鼻血就匆匆出院,理由是怕给包工头添麻烦。
出院后一直头昏流鼻血也自己扛着,期间包工头不管不问老李身体无法支撑他出门,态度恶劣甚至辱骂让他去送材料到公司让公司报销,不送去就再也不管他。当老李问及赔偿事宜怎么处理时,包工头云淡风轻的说人现在又没事,给个万把块不就好了,老李一辈子太胆小懦弱了,不会又不敢维权,怕包工头前年和去年拖欠的工资不给自己(包工头没打欠条),自己一个人在家生闷气,好几天不吃饭。

会哭的孩子有糖吃,听话的孩子去奔涌吧。

老李就是这样的一个人,一辈子默默的吃着闷亏,遇事只知道生闷气,惩罚自己然后劝说自己妥协。这样的心态绝不止老李一个人,自古以来我们的老百姓就是这样,因为出身贱民,因为怕给任何人带去麻烦,因为经不起磨难,因为这样的人最好管理,因为你的出身就是你的原罪。

因为我曾经看见过光,所以我再也不怕黑暗。

我就是想在每篇文章的开头写一些人和事,想表达一些可以值得思考的东西。老李的家人曾经去过项目部找公司,也找过包工头,但是都没有人处理。不管哪个社会,没人没钱都不好办事,现实且残忍,如果没有关系,老李要么继续熟练的忍气吞声,要么自己一直找公司或者包工头纠缠无果。

问题分析

社会现实角度:老李吃了那么大的亏,现在公司和包工头都不管不问,相互踢皮球,而老李又软弱惯了,无可奈何。要怎么解决这个问题呢?老李有个亲戚老赵听到此事非常气愤,老实人就要任人宰割吗?老赵利用自己的人脉关系直接找到了公司的大老板,大老板说这事包在他身上,他让项目经理去处理,不用老李在来回跑了,等处理结果就好了。

我们再从技术角度分析一下,一是老李不知道具体找谁处理工伤事故,也就是找不到处理他赔偿请求的责任人,另一个就是老李需要不断的和公司或者包工头纠缠,也就是耦合性非常高,而这两点都违背了我们日常开发的设计原则。

这个时候,我们本文的重点,责任链模式就正式登场了。

责任链模式

什么是责任链模式?

责任链模式(Chain of Responsibility):使多个对象都有机会去处理请求。从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

责任链模式也叫职责链模式,属于行为型模式。通过责任链模式,可以为某个请求创建一个对象链。每个对象按照顺序检查该请求,并处理该请求,或者传给链中的下一个对象处理。

责任链模式的三个角色

责任链模式主要有以下三个角色:

抽象处理者角色(Handler):定义一个处理请求的接口,内部包含一个后继处理者的引用和一个处理请求的方法,抽象处理者可以是一个接口或者抽象类。

具体处理者角色(ConcreteHandler):实现抽象处理者。如果能够处理请求则处理,否则就将该请求转发给它的后继处理者。在具体处理者中可以访问链中下一个对象,以便请求的转发。

请求发送者角色:创建处理链,同时向链头的具体处理者对象提交请求,它并不关心处理细节和请求的传递过程。

责任链UML图

在这里插入图片描述

代码实例

上文中我们知道老李的亲戚老赵出面才摆平了此事,那老赵是怎么解决的呢?老赵找到公司的大老板,大老板让项目经理处理,项目经理让包工头或者其他人配合处理,这就形成了一个对象责任链,总有一个对象处理赔偿的请求,而老李再也不用关心具体是谁处理的工伤赔偿的请求。

下面我们用代码来演示一遍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxdz.html