switch case 看着方便,但是如果後期要加入條件:
- 還要修改原代碼,導致迴歸測試,測試成本增加
- 不遵循開閉原則(對修改關閉,對拓展開放)
所以,我選擇了策略模式來解決該問題。。。
一,首先了解下業務(大概說一下):
字段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;
略。。
}
三,使用策略改寫
- 首先寫策略類
public interface CallBackStrategy {
Boolean isOwn(String eventType);
void getCallBack(JSONObject obj );
}
- 寫具體的策略
@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;
}
}
}
}