用策略模式代替if-else
业务:接入钉钉,监听回调,不同的回调对应不同的业务处理方式,如果使用if-else判断回调的code,那么代码不好维护,所以用策略去代替if-else
DingDingContext
package cn.com.infox.system.controller;
import com.alibaba.fastjson.JSONObject;
/**
* @Description 钉钉策略实现
* @Author JunHao Huang
* @Date 2023/6/1 17:14
*/
public class DingDingContext {
private DingDingStrategy dingDingStrategy;
public String selectEventType(String eventType, JSONObject eventJson) {
dingDingStrategy = DingDingStrategyFactory.getInstance().create(eventType);
if (dingDingStrategy != null) {
return dingDingStrategy.selectEventType(eventJson);
}
return null;
}
public DingDingStrategy getDingDingStrategy() {
return dingDingStrategy;
}
public void setDingDingStrategy(DingDingStrategy dingDingStrategy) {
this.dingDingStrategy = dingDingStrategy;
}
}
DingDingController
DingDingContext dingDingContext = new DingDingContext();
dingDingContext.selectEventType(eventType,eventJson);
DingDingEventTypeEnum
package cn.com.infox.system.controller;
/**
* @Description 钉钉回调枚举
* @Author JunHao Huang
* @Date 2023/6/1 17:25
*/
public enum DingDingEventTypeEnum {
/**修改角色或者角色组*/
LABEL_CONF_MODIFY("label_conf_modify","label_conf_modify"),
/**增加角色或者角色组*/
LABEL_CONF_ADD("label_conf_add","label_conf_add");
private String msg;
private String code;
DingDingEventTypeEnum(String msg, String code) {
this.msg = msg;
this.code = code;
}
public String getMsg() {
return msg;
}
public String getCode() {
return code;
}
}
DingDingStrategy
package cn.com.infox.system.controller;
import com.alibaba.fastjson.JSONObject;
/**
* @Description 钉钉回调策略
* @Author JunHao Huang
* @Date 2023/6/1 17:10
*/
public interface DingDingStrategy {
String selectEventType(JSONObject eventJson);
}
DingDingStrategyFactory
package cn.com.infox.system.controller;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description 钉钉策略工厂
* @Author JunHao Huang
* @Date 2023/6/1 17:18
*/
public class DingDingStrategyFactory {
private static DingDingStrategyFactory factory = new DingDingStrategyFactory();
private DingDingStrategyFactory(){}
private static ConcurrentHashMap strategyMap = new ConcurrentHashMap<>(16);
static {
strategyMap.put(DingDingEventTypeEnum.LABEL_CONF_MODIFY.getCode(),new LabelConfModifyStrategy());
strategyMap.put(DingDingEventTypeEnum.LABEL_CONF_ADD.getCode(),new LabelConfAddStrategy());
}
public DingDingStrategy create(String eventType){
return (DingDingStrategy) strategyMap.get(eventType);
}
public static DingDingStrategyFactory getInstance(){
return factory;
}
}
LabelConfAddStrategy
package cn.com.infox.system.controller;
import cn.com.infox.core.tool.utils.DateUtil;
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
/**
* @Description 新增角色或者角色组
* @Author JunHao Huang
* @Date 2023/6/1 17:28
*/
public class LabelConfAddStrategy implements DingDingStrategy {
@Override
public String selectEventType(JSONObject eventJson) {
Long timeStamp = eventJson.getLong("TimeStamp");
System.out.println("新增角色或者角色组");
System.out.println(timeStamp);
System.out.println(DateUtil.formatDateTime(new Date(timeStamp)));
return "成功";
}
}
LabelConfModifyStrategy
package cn.com.infox.system.controller;
import cn.com.infox.core.tool.utils.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
/**
* @Description 修改角色或者角色组
* @Author JunHao Huang
* @Date 2023/6/1 17:28
*/
public class LabelConfModifyStrategy implements DingDingStrategy {
@Override
public String selectEventType(JSONObject eventJson) {
JSONArray postLabelList = eventJson.getJSONArray("PostLabelList");
Long timeStamp = eventJson.getLong("TimeStamp");
System.out.println("修改角色或者角色组");
System.out.println(timeStamp);
System.out.println(DateUtil.formatDateTime(new Date(timeStamp)));
for (Object o : postLabelList) {
JSONObject jsonObject = JSON.parseObject((String) o);
PostLabel postLabel = JSONObject.toJavaObject(jsonObject, PostLabel.class);
//以修改时间为准,而不是回调时间
//用钉钉的修改时间比较数据库当条记录的返回的修改时间,如果数据库存储的修改时间大于本次修改时间,则不做任何操作
System.out.println("修改角色或者角色组:" + postLabel.getName() + ",修改时间" + DateUtil.formatDateTime(new Date(timeStamp)));
}
return "成功";
}
}