策略模式的原理此处不在赘述,此种方式主要介绍通过实现BeanPostProcessor类来实现策略枚举。
提示:以下是本篇文章正文内容,下面案例可供参考
一、需求背景
下游系统需接收上游系统传参类型实现调用不同的业务逻辑(例如:加、减、乘除),在选择处理逻辑时可能会出现较为复杂的判断逻辑。因此,可采用枚举与策略模式相结合的方式来降低代码复杂度。
二、实现BeanPostProcessor
代码如下(示例):
1、计算方式枚举
public enum OperationType {
/**
* 加
*/
ADD("ADD","加"),
/**
* 减
*/
SUB("SUB","减");
/**
* 代码
*/
private String code;
/**
* 消息
*/
private String msg;
OperationType(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
2、定义接口
public interface IOperation {
/**
* 获取类型
* @return
*/
OperationType type();
/**
* 两数操作
* @param num1
* @param num2
* @return
*/
int operation(int num1, int num2);
}
3、具体计算策略
1)减操作
public class OperationSub implements IOperation {
@Override
public OperationType type() {
return OperationType.SUB;
}
@Override
public int operation(int num1, int num2) {
return num1 - num2;
}
}
2)加操作
public class OperationAdd implements IOperation {
@Override
public OperationType type() {
return OperationType.ADD;
}
@Override
public int operation(int num1, int num2) {
return num1 + num2;
}
}
4、分配策略
通过实现BeanPostProcessor加载所有的策略
@Slf4j
public class OperationContext implements BeanPostProcessor {
private static Map<String, IOperation> handlerMap = new HashMap<>();
/**
* 分发事件
* @param event
*/
public void dispatch(String event) {
Objects.requireNonNull(event);
try {
IOperation opt = handlerMap.get(event);
//opt.operation();
} catch (Exception e) {
log.warn("Event handler process failed, eventType:{}, exception:{}", event, e);
}
}
@Override
public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
if (bean instanceof IOperation) {
Iterator<Map.Entry<String,IOperation>> strategy = handlerMap.entrySet().iterator();
while (strategy.hasNext()){
Map.Entry<String,IOperation> entry = strategy.next();
if (entry.getClass() == bean.getClass()){
return bean;
}
}
log.info("register EventHandler , handler:{}", bean);
handlerMap.put(((IOperation) bean).type().getCode(),(IOperation) bean);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
return bean;
}
}
总结
以上就是今天要讲的内容,本文介绍了策略枚举的使用,而策略枚举还有更多的用法,欢迎大家提供自己的思路。