Java if-elseif-else抓狂代碼使用Spring 策略模式+工廠模式解決

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

優化後

  1. 創建一個UserApproval接口用戶抽離公共核心審批方法
    @Component
    public interface UserApproval {
    	
    	/**
    	 * 用戶代碼
    	 */
    	final String userCode = "";
    	
    	String getUserCode();
    
    	/**
    	 * 用戶審批業務
    	 * @return 審批結果
    	 */
    	String approval();
    }
  2. 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;
    	}
    
    }
    

     

  3. 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;
    	}
    
    }
    

     

  4. 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;
    	}
    
    }
    

     

  5. 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("沒有找到該審批人");
    	    }
    	}
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章