Java 中业务代码经常会遇到多个if-elseif-else让人抓狂
- 不方便运维,每次修改一个业务,会改动整个业务类
- 强耦合,一个类处理所有业务
- 一个类代码太长
优化前
/**
* 签批核心业务方法
* @param userCode 审批人代码
* @return 审批结果信息
*/
public String approval2(String userCode) {
if("ceo".equalsIgnoreCase(userCode)) {
// .... ceo审批业务
return "ceo审批了";
}else if("manager".equalsIgnoreCase(userCode)) {
// ... 部门经理审批
return "部门经理审批了";
}else if("director".equalsIgnoreCase(userCode)) {
// .. 直接主管审批
return "直接主管审批";
}else {
throw new IllegalArgumentException("没有找到该审批人");
}
}
优化后
- 创建一个UserApproval接口用户抽离公共核心审批方法
@Component
public interface UserApproval {
/**
* 用户代码
*/
final String userCode = "";
String getUserCode();
/**
* 用户审批业务
* @return 审批结果
*/
String approval();
}
- CEOApproval实现UserApproval的接口,将CEO审批的核心代码写到Approva方法
package com.tao.study.service;
import org.springframework.stereotype.Component;
@Component
public class CEOApproval implements UserApproval {
private final String userCode = "CEO";
/**
* 执行董事审批
*/
public String approval() {
String msg = "CEO审批了";
return msg;
}
public String getUserCode() {
return this.userCode;
}
}
- ManagerApproval实现UserApproval的接口,将部门经理审批的核心代码写到Approva方法
package com.tao.study.service;
import org.springframework.stereotype.Component;
@Component
public class ManagerApproval implements UserApproval {
private final String userCode = "manager";
/**
* 部门经理审批
*/
public String approval() {
String msg = "经理审批完成了";
return msg;
}
public String getUserCode() {
return this.userCode;
}
}
- DirectorApproval实现UserApproval的接口,将主管审批的核心代码写到Approva方法
package com.tao.study.service;
import org.springframework.stereotype.Component;
@Component
public class DirectorApproval implements UserApproval {
private final String userCode = "director";
/**
* 直接主管审批
*/
public String approval() {
String msg = "直接主管审批了";
return msg;
}
public String getUserCode() {
return this.userCode;
}
}
- ApprovalService审批核心业务类,用户初始化审批用户策略
package com.tao.study.service;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.stereotype.Service;
@Service
public class ApprovalService {
/**
* 用户审批策略使用BeanFactory
*/
private static Map<String, UserApproval> userApprovalStrategy = new ConcurrentHashMap<String, UserApproval>();
/**
* 构造函数初始化将审批核心业务类创建工厂,等待核心业务使用时,直接从工厂获取相应的审批人来处理
* @param userApprovals 用户审批的实现类清单
*/
public ApprovalService(List<UserApproval> userApprovals) {
for(UserApproval userApproval : userApprovals) {
System.out.println("userCode: " + userApproval.getUserCode());
userApprovalStrategy.put(userApproval.getUserCode(),userApproval);
}
}
public String approval(String userCode) {
for(String code : userApprovalStrategy.keySet()) {
System.out.println("userCode: " + code);
}
UserApproval userApproval = userApprovalStrategy.get(userCode);
if(userApproval==null) {
throw new IllegalArgumentException("用户代码没有找到!");
}
return userApproval.approval();
}
/**
* 签批核心业务方法
* @param userCode 审批人代码
* @return 审批结果信息
*/
public String approval2(String userCode) {
if("ceo".equalsIgnoreCase(userCode)) {
// .... ceo审批业务
return "ceo审批了";
}else if("manager".equalsIgnoreCase(userCode)) {
// ... 部门经理审批
return "部门经理审批了";
}else if("director".equalsIgnoreCase(userCode)) {
// .. 直接主管审批
return "直接主管审批";
}else {
throw new IllegalArgumentException("没有找到该审批人");
}
}
}