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;
}
}
}
}
版权声明:本文为wzcyamadie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。