前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >12.设计模式--责任链模式(Chain of Responsibility模式)

12.设计模式--责任链模式(Chain of Responsibility模式)

作者头像
大猫的Java笔记
发布2021-11-11 09:40:20
3260
发布2021-11-11 09:40:20
举报
文章被收录于专栏:大猫的Java笔记大猫的Java笔记

1.定义

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

首先看看什么叫推卸责任,我们去公司申请财务报销,当找到财务时填写报销单后,被告知金额太大只能找财务主管批,于是我们拿着资料去找财务主管,财务主管说金额还是太大只能找老板批。这里相当于将责任传递下去即推卸责任。原因是每个财务能审批的最大金额是不一样的。

通过上面的报销例子,我们可以看到自己因为报销找了很多人,这些人相当于一个链条,即第一个不能解决那么找第二个(财务主管),第二个不能解决找第三个(老板)直到找到到底该谁来进行审批即谁来处理。

2.责任链模式结构图

Financial作为财务部门的抽象,而FinancialStaff是财务普通员工,普通员工只能审批金额为0-2000元的资金,FinancialLeader是财务部门负责人只能审批金额为0-10000元的资金,而CEO只能审批0-50000元的资金。如果报销金额超过50000元,那么剩余的金额就需要自己承担。这里CEO这个人员实际上例子举得不是特别好,因为实际上CEO并不属于财务部门所以不应该继承Financial。

3.责任链模式实现

Reimbursement是报销人员,所以定义了报销金额已经报销人员的名字,而报销的处理则是交给财务进行审批后处理。

Financial是财务人员的抽象,其中包含财务人员名字,以及上级领导。而jurisdiction则是一个抽象方法,就是模板方法设计模式,具体每个财务能审核多少金额由子类去决定,process则是审批流程,如果不在自己审批金额内那么交给上级处理,也就是推卸责任。

FinancialStaff是普通的财务人员,作为普通的财务人员只能处理0-2000元的审批的报销。

FinancialLeader是财务部门的负责人,作为负责人那么能够审批的金额肯定比普通员工要大,所以财务部门负责人可以审批0-10000元的报销。

CEO是公司的老大,但是并不是无论多少金额都可以审批,得有一个限制,所以CEO只能审批0-50000元的报销金额,如果超过50000元则需要自行承担(当然你可以选择多次审批😀)。

下面就是开始报销了,现在赵六已经出差了3年了,花销是极大的。如果再不报销,下个月只能吃土了,赵六这3年里花了100000元,然后找到财务报销,可是由于财务部门报销金额的级别是有区别的,所以普通员工让找部门负责人,而负责人让找CEO,可是CEO说赵六报销金额超过公司规定的最大报销金额,多余部门需要自己承担,或者多批次报销。

通过报销可以看到如果处理不了,就推卸给其他人或者说交给其他人来处理。这样报销者和审批者就做到了分离与解耦,如果后续公司发展足够大了,此时每个财务人员审批金额可能需要调整(毕竟不差钱了),此时由于报销者和审批者分离,所以不需要对报销者代码进行更改。

责任链模式中登场的角色

Handler(处理者),用于定义处理请求的api,同时如果处理不了交给下一个处理者,文中由Financial抽象类担任此角色。

ConcreteHandler(具体的处理者),具体的处理者是对Financial的继承,文中由FinancialStaff、FinancialLeader、CEO担任此角色。

Client(请求者),是向第一个ConcreteHandler发起请求的角色,文中由Test扮演此角色。

参考文献《图解设计模式》

代码获取地址:https://gitee.com/bughong/design-pattern

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的Java笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档