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