引言
以请假流程为例,一般公司普通员工的请假流程简化如下:
普通员工发起一个请假申请,当请假天数小于3天时只需要得到主管批准即可;当请假天数大于3天时,主管批准后还需要提交给经理审批,经理审批通过,若请假天数大于7天还需要进一步提交给总经理审批。
使用 if-else
来实现这个请假流程的简化代码如下:
public class LeaveApproval { public boolean process(String request, int number) { boolean result = handleByDirector(request); // 主管处理 if (result == false) { // 主管不批准 return false; } else if (number < 3) { // 主管批准且天数小于 3 return true; } result = handleByManager(request); // 准管批准且天数大于等于 3,提交给经理处理 if (result == false) { // 经理不批准 return false; } else if (number < 7) { // 经理批准且天数小于 7 return true; } result = handleByTopManager(request); // 经理批准且天数大于等于 7,提交给总经理处理 <a>本文来源gao*daima.com搞@代#码&网6</a> if (result == false) { // 总经理不批准 return false; } return true; // 总经理最后批准 } private boolean handleByDirector(String request) { // 主管处理该请假申请 if(request.length()>10) return false; return true; } private boolean handleByManager(String request) { // 经理处理该请假申请 if(request.length()>5) return false; return true; } private boolean handleByTopManager(String request) { // 总经理处理该请假申请 if(request.length()>3) return false; return true; } }
问题看起来很简单,三下五除二就搞定,但是该方案存在几个问题:
-
LeaveApproval
类比较庞大,各个上级的审批方法都集中在该类中,违反了 “单一职责原则”,测试和维护难度大 - 当需要修改该请假流程,譬如增加当天数大于30天时还需提交给董事长处理,必须修改该类源代码(并重新进行严格地测试),违反了”开闭原则”
- 该流程缺乏灵活性,流程确定后不可再修改(除非修改源代码),客户端无法定制流程