策略模式小样

72 篇文章 1 订阅
3 篇文章 0 订阅
文章展示了如何用策略模式替换if-else来处理钉钉的回调事件。通过创建DingDingStrategy接口和不同的实现类如LabelConfAddStrategy、LabelConfModifyStrategy,根据回调的code从DingDingStrategyFactory工厂获取相应的处理策略,实现了代码的可扩展性和维护性。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值