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