用策略模式替代switch case

switch case 看着方便,但是如果後期要加入條件:

  1. 還要修改原代碼,導致迴歸測試,測試成本增加
  2. 不遵循開閉原則(對修改關閉,對拓展開放)
    所以,我選擇了策略模式來解決該問題。。。
    一,首先了解下業務(大概說一下):
    字段eventType有多種情況(org_dept_create,org_dept_modify,org_dept_remove,。。。。),不同情況下走不同得邏輯
    二,用switch case的代碼,實際上有十幾個條件呢,這裏舉例3個。
 switch (eventType) {
            case "org_dept_create":
                userAddOrg(obj);
                break;
            case "org_dept_modify":
                userModifyOrg(obj);
                break;
            case "org_dept_remove":
                userLeaveOrg(obj);
                break;
            略。。
        }

三,使用策略改寫

  1. 首先寫策略類

public interface  CallBackStrategy {

      Boolean isOwn(String eventType);

      void getCallBack(JSONObject obj );
}
  1. 寫具體的策略
@Slf4j
@Service
public class OrgDeptCreate implements CallBackStrategy {

    private static final String orgDeptCreate = Constant.ORGDEPTCREATE;

    @Override
    public Boolean isOwn(String eventType) {
        if (orgDeptCreate.equals(eventType)){
            return true;
        }
        return false;
    }

    @Override
    public void getCallBack(JSONObject obj) {
	    // 實際的對應業務        
    }
}

@Slf4j
@Service
public class OrgDeptModify implements CallBackStrategy {

    private static final String orgDeptModify = Constant.ORGDEPTMODIFY;

    @Override
    public Boolean isOwn(String eventType) {
        if (orgDeptModify.equals(eventType)){
            return true;
        }
        return false;
    }

    @Override
    public void getCallBack(JSONObject obj) {
          // 實際的對應業務     
    }
}
@Slf4j
@Service
public class OrgDeptRemove implements CallBackStrategy { 

    private static final String orgDeptRemove = Constant.ORGDEPTREMOVE;

    @Override
    public Boolean isOwn(String eventType) {
        if (orgDeptRemove.equals(eventType)){
            return true;
        }
        return false;
    }

    @Override
    public void getCallBack(JSONObject obj) {
         // 實際的對應業務        
    }
}

四,具體使用方代碼

@Slf4j
@RestController
public class CallbackController {

    @Resource
    private List<CallBackStrategy> callBackStrategies;
	
	public void test(){
		// 這裏的for循環代碼就是之前switch case 的代碼替代品
		for (CallBackStrategy callBackStrategy : callBackStrategies) {
	            log.info("當前策略類:callBackStrategy = " + callBackStrategy);
	            if (callBackStrategy.isOwn(eventType)) {
	                callBackStrategy.getCallBack(obj);
	                break;
	            }
	        }
	}  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章