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("沒有找到該審批人");
}
}
}