用策略模式替代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;
	            }
	        }
	}  
}

你可能感兴趣的:(JAVA)