责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送,在收到请求后,每个处理这均可对请求进行处理,或将其传奇给链上的下个处理者
下面就是现实中使用的一个场景,一个公司的员工,需要进行请假,会经过以下几种情况,请假天数小于4天,主管审批,请假天数大于3天小于8天项目经理审批,请假天数大于7天,公司总经理审批
1.有四个角色,职员,主管,项目经理,总经理
2.动作:职员请假,主管,项目经理,总经理审批,这个是已有场景中可以获取到的信息,但是还缺少一个信息,就是请假的信息,这个对象需要怎么构建
- 首先我们会定义角色对象,GeneralManager,ProjectManager,Supervisor,Employee,再定义对象之间信息传输的过程信息对象ProcessInfo,这个对象中,有审批结果信息,审批天数,审批评论,审批角色(谁审批),对于审批结果我们可以定一个StatusConstants,常量池,方便对象的审批状态获取,应该是各个角色都赋予的功能,动作的发起对象,动作的审批对象,过程的信息模型我们也创建好,那接下来,来写核心处理器,因为我们会对行为和属性进行抽象,所以使用抽象类比接口更为合适,还有抽象类更适合实现流程话的方式
在抽象类中,我们会创建两个方法,一个是各个角色都要实现各自功能的方法的approve,还有一个是各个角色approve后的,统一处理方法afterApprove,比如通知职员审批结果等操作
下面是实现代码,代码总共分为三部分,发起,执行动作,执行动作后
private static void callDesign(){ Employee employee = new Employee(); Integer wDay = employee.submit(); ProcessInfo processInfo = new ProcessInfo(); processInfo.setDay(wDay); Supervisor supervisor = new Supervisor(); supervisor.approve(processInfo); } public void approve(ProcessInfo processInfo) { processInfo.setResult(StatusConstants.approve_rs_agree); processInfo.setRole(role_name); super.afterApprove(processInfo); //可以加入外部动作... super.handler(new ProjectManager(), processInfo); } public abstract void approve(ProcessInfo processInfo); public void afterApprove(ProcessInfo p){ if (StatusConstants.approve_rs_agree.equals(p.getResult())){ System.out.println(p.getRole() + " " +StatusConstants.approve_rs_agree); } else { System.out.println(p.getRole() + " " +StatusConstants.approve_rs_reject); System.out.println(p.getRole() + " " +p.getComment()); } }
- 这种情况,如果没有设计模式的实现,会发现代码很大冗余,不好改动,实现比较简单
private static void callNoDesign(){ Employee employee = new Employee(); Integer wDay = employee.submit(); if (wDay < 4) { Supervisor supervisor = new Supervisor(); supervisor.approve(); } else if (wDay < 8){ Supervisor supervisor = new Supervisor(); supervisor.approve(); ProjectManager projectManager = new ProjectManager(); projectManager.approve(); } else { Supervisor supervisor = new Supervisor(); supervisor.approve(); ProjectManager projectManager = new ProjectManager(); projectManager.approve(); GeneralManager generalManager = new GeneralManager(); generalManager.approve(); } }