当前位置: 首页 > 科技观察

在OA系统中使用责任链模型实现加薪流程审批

时间:2023-03-21 22:23:32 科技观察

本文转载自微信公众号《Java极客技术》,作者:鸭血粉。转载本文请联系Java极客技术公众号。大家好,我是阿芬。在我们的工作中,经常会遇到很多需要上级或上级批准的流程。作为一个程序员,如果想让你实现这个过程,你会用什么方法呢?好吧想一想,显然大家一致的回答是责任链模型。那么什么是责任链模型呢?如何使用责任链模型来完成这个过程呢?下面我们一起来看看吧。需求分析和开发之前的第一步是需求分析。我们的场景是这样的。阿芬准备向A领导申请加薪,最满意的结果是直接向上级领导A申请,理想非常好。丰满,非常有骨气。leaderA只是teamleader,没有直接加薪的权利,所以leader也要向上级B申请,不过这里还没完,因为B还要向上司C申请,C是主管人力资源部,人事C同事最终要向CEO提出申请。想想这个过程是多么的负责任,阿芬不由的死心了。毕竟阿芬只是一个小发展,为什么加薪这么难,阿芬晕倒在厕所里。在这个场景中,有几个需求点,就是每个人都有自己的权限,在自己能力范围内的事情可以直接审批,不在自己能力范围内的只能反馈自己的能力;申请的内容是加薪,最终CEO拥有最终决定权。在初始版本中,我们首先定义了一个工单模型,具体代码如下packagecom.test.model.chain;publicclassApplyModel{//应聘者姓名privateStringapplyName;//工单类型privateStringtype;//工单内容privateStringcontent;//加薪privateintsalary;//...getset省略}初版加薪申请代码如下,及根据不同的leader和不同的应用类型进行相应的逻辑处理。packagecom.test.model.chain;publicclassClientApplyServiceDemo{publicvoidhandlerApply(Stringleader,ApplyModelapplyModel){if("A".equals(leader)){if("加薪".equals(applyModel.getType())&&applyModel.getSalary()<100){System.out.println("加薪小于100,A可以直接处理");}else{System.out.println("加薪大于100,A不能处理");}}if("B".equals(leader)){if("加薪".equals(applyModel.getType())&&applyModel.getSalary()<300){System.out.println("加薪不足300,B可直接处理");}else{System.out.println("涨薪大于300,B无法办理");}}if("C".equals(leader)){if("涨薪".equals(applyModel.getType())&&applyModel.getSalary()<500){System.out.println("加薪小于500,C可直接处理");}else{System.out.println("加薪大于500,C不能处理");}}if("CEO".equals(leader)){if("加薪".equals(applyModel.getType())&&applyModel.getSalary()<800){System.out.println("如果加薪不足800,CEO可以直接处理");}else{System.out.println("CEO不能处理大于800的加薪,下次别做梦了");}}}}以上代码不要走,否则你会被炒鱿鱼不要自责显然,上面的代码可以用一个词来形容,那就是糟糕!两个字真的很烂!!如果你在实际工作中写了这样的代码,那么恭喜你,你已经在被炒鱿鱼的路上了。那么我们如何通过责任链的设计模式让整个代码变得优雅呢?什么是责任链模式,让多个对象有机会处理请求,从而避免请求的发起者和接收者之间的耦合,把这个对象连成一条链,沿着链传递请求,直到一个对象处理它。重构思路也是一样的,我们有上级和下级,每个领导都有一个上级和他能处理的能力范围,所以我们可以按照下面的类图来设计,我们可以通过申请工单的请求按照职级往上,当你自己处理不了的时候,反馈给你的上级,当你的上级完成不了的时候,你再向上级传递,直到某个级别可以处理为止。首先,我们设计一个抽象类Leader,代码如下}publicabstractvoidhandlerApply(ApplyModelapplyModel);}下面是具体的四个子类。具体代码如下;@OverridepublicvoidsetLeader(Leaderleader){this.leader=leader;}@OverridepublicvoidhandlerApply(ApplyModelapplyModel){if(applyModel.getSalary()<100){System.out.println("申请金额为"+applyModel.getSalary()+"小于100,A能搞定");}else{leader.handlerApply(applyModel);}}}packagecom.test.model.chain.leader.impl;importcom.test.model.chain.应用模型;导入com.test.model。chain.leader.Leader;publicclassBLeaderextendsLeader{protectedLeaderleader;@OverridepublicvoidsetLeader(Leaderleader){this.leader=leader;}@OverridepublicvoidhandlerApply(ApplyModelapplyModel){if(applyModel.getSalary()<300){System.out.println("申请金为"+applyModel.getSalary()+"小于300,B可以处理");}else{leader.handlerApply(applyModel);}}}packagecom.test.model.chain.leader.impl;importcom.test.model.chain.ApplyModel;importcom.test.model.chain.leader.Leader;publicclassCLeaderextendsLeader{protectedLeaderleader;@OverridepublicvoidsetLeader(Leaderleader){this.leader=leader;}@OverridepublicvoidhandlerApply(ApplyModelapplyModel){if(applyModel.getSalary()<500){System.out.println("申请金为"+applyModel.getSalary()+"小于500,C可以处理");}else{leader.handlerApply(applyModel);}}}packagetest.model.chain.leader.impl;importtest.model.chain.ApplyModel;importcom.test.model.chain.leader.Leader;publicclassCEOLeaderextendsLeader{protectedLeaderleader;@OverridepublicvoidsetLeader(Leaderleader){this.leader=leader;}@OverridepublicvoidhandlerApply(ApplyModelapplyModel){if(applyModel.getSalary()<1000){System.out.println("申请金额为"+applyModel.getSalary()+"不足1000,CEO同意");}else{System.out.println("想加薪"+applyModel.getSalary()+"这么多,下次再说");}}}抽象类中有一个属性,一个构造方法,一个抽象方法;相应的子类实现自己的抽象方法来处理自己的每个实现类认为根据自己的能力,如果自己处理相应的应用条件,这样的结构可以更易读,并且每个人的处理能力互不影响.如果一个人的能力发生变化,修改自己那部分就好了。接下来我们看看client是怎么调用的。packagecom.test.model.chain;importcom.test.model.chain.leader.Leader;importcom.test.model.chain.leader.impl.ALeader;importcom.test.model.chain.leader.impl.BLeader;importcom.test.model.chain.leader.impl.CEEOLeader;importcom.test.model.chain.leader.impl.CLeader;publicclassClientApplyService{publicstaticvoidmain(String[]args){ApplyModelapplyModel=newApplyModel();applyModel.setApplyName("一粉");applyModel.setContent("申请加薪");applyModel.setSalary(50);LeaderaLeader=newALeader();LeaderbLeader=newBLeader();LeadercLeader=newCLeader();LeaderceoLeader=newCEEOLeader();aLeader.setLeader(bLeader);bLeader.setLeader(cLeader);cLeader.setLeader(ceoLeader);aLeader.handlerApply(applyModel);}}我们修改一下加薪的值,看看执行结果。申请加薪50的运行结果如下(忽略具体数值,相信我,如果只加薪50,那简直就是侮辱,这种公司还是尽快避开吧)。调整加薪幅度为150,运行结果如下。调整增量为550,运行结果如下:调整增量为1550,运行结果如下:经过我们的重构,整个代码结构非常清晰,比现在的代码优雅很多初始版本,使用责任链的好处是对请求逐层处理,直到有对象可以处理,可以避免耦合。