EventBus 实现java状态机实例
发布时间:2023-02-20 11:04:21 所属栏目:Java 来源:互联网
导读:首先,了解状态机是什么,我们为什么需要状态机! 举个最简单例子,请假,作为一个最底层程序员,每次请假都要领导层层审批,而假有分为很多种,事假,病假,婚假,年休假等等,当然选择请的假不同,审批标准也不同,不同的假单需要走的审批链也不一样,比如
首先,了解状态机是什么,我们为什么需要状态机! 举个最简单例子,请假,作为一个最底层程序员,每次请假都要领导层层审批,而假有分为很多种,事假,病假,婚假,年休假等等,当然选择请的假不同,审批标准也不同,不同的假单需要走的审批链也不一样,比如年休假,可能只需要领导审批扣掉年休假即可,请病假需要领导审批,领导审批之后,先休假,等休完假回来提交病假的材料,由hr审批之后才能完成整个请假过程。更有甚者,如果你要修一个一个月的长假,就不仅仅是需要直线领导hr审批,可能还需要公司ceo审批 ,审批通过后,才能通过。如下图: 当然,实际来讲,请假的种类和链路比这个要复杂的多,我们一般会怎么实现,是否要使用if else了,对应不同的假单,走不同的分支,代码写出来就成了一个非常复杂的,多级嵌套的代码了,后面如何维护代码,多了几种假的种类,是不是又要if else了。如下代码: public void requestLeavePermit(String type){ if(type.equals("事假")){ //领导审批->hr审批->ceo审批->完成 }else if(type.equals("病假")){ //领导审批->休假->补充病例->hr审批->完成 }else if(type.equals("年休假")){ //领导审批->hr审批->通过 }else if(type.equals("产假")){ //领导审批->hr审批->通过 }else if(type.equals("调休假")){ //领导审批->ceo审批->通过 } } 或者写成这个样子: public void requestLeavePermit(String type,String userName){ switch (type){ case "事假": //领导审批->hr审批->ceo审批->完成 break; case "病假": //领导审批->休假->补充病例->hr审批->完成 break; case "年休假": //领导审批->hr审批->通过 break; case "产假": //领导审批->hr审批->通过 break; case "调休假": //领导审批->ceo审批->通过 default: break; } } if,else嵌套太深,然后每个if,else又是自己的处理流程,这样代码结构会原来越复杂,当审批链发生变更,这个时候会发现代码耦合性太强,导致修改起来很麻烦。 如何解决这个问题,我们不难看到,所有的请假都经过了这样几个阶段,从请假开始,提交假单,然后领导审批,hr审批,ceo审批,只是不同的是,有些审批流程多了审核人或者是少了审核人,每种假单审核材料有所不同而已。 我们如何使用状态机来如何解决代码耦合性的问题,提高代码可扩展性可读性。 如果我们把领导审批,hr审批,ceo审批,分别看做一个动作,每个相应都有几个状态,审批通过,不通过,拒绝,重新审核,会怎么样? public enum LeavePermitEnum { ANNUAL_LEAVE("annual_leave","年休假 "),CASUAL_LEAVE("casual_leave","事假"),MEDICAL_LEAVE("medical_leave","病假"),MARRIAGE_LEAVE("marriage_leave","婚假"),; private String type; private String memo; //此处忽略构造方法和set/get方法 } 领导审批,hr审批,ceo审批,都有一个审批意见(通过,拒绝,或者是重修修改假单补充材料等),在这里,相当于一个事件Event,于是,整个状态扭转也可以用一个枚举类来表示,审批意见由一个枚举类Event来表示。 public enum Event { AGREE("agree","同意"),disSAGREE("disagree","不同意"),MODIFY("modify","修改"),; private String type; private String memo; } 因此,一个假单的状态就有很多种,用一个枚举代表整个假单的状态: public enum Status { //提交假单 PERMIT_SUBMIT("permitSubmit","提交假单"),//领导审批 leader_PERMITING("leaderPermiting","领导审批中"),leader_PERMIT_AGREE("leaderAgree","领导同意"),leader_PERMIT_disAGREE("leaderdisAgree","领导不同意"),leader_PERMIT_MODIFY("leaderModify","领导觉得需要补充材料重修修改"),//hr审批 HR_PERMITING("hrPermiting","hr审批中"),HR_PERMIT_AGREE("hrAgree","hr同意"),HR_PERMIT_disAGREE("hrdisAgree","hr不同意"),HR_PERMIT_MODIFY("hrModify","hr觉得需要补充材料重修修改"),//ceo审批 CEO_PERMITING("ceoPermiting",CEO_PERMIT_AGREE("ceoAgree","ceo同意"),CEO_PERMIT_disAGREE("ceodisAgree","ceo不同意"),CEO_PERMIT_MODIFY("ceoModify","ceo觉得需要补充材料重修修改"),//最终请假状态 PERMIT_SUCCESS("permitSuccess","请假成功"),PERMIT_FAIL("permitFail","请假失败") ; private String status; private String memo; private Status(String status,String memo){ this.status=status; this.memo=memo; (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |