策略枚举的实现

策略模式的原理此处不在赘述,此种方式主要介绍通过实现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;
    }
}

总结

以上就是今天要讲的内容,本文介绍了策略枚举的使用,而策略枚举还有更多的用法,欢迎大家提供自己的思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值