• spring策略模式


    public interface Strategy {
    
    
        /**
         * 调用策略方法
         * @param strategyParam 执行策略方案参数
         * @return 业务处理返回结果封装实体
         */
        AjaxResult invokeStrategy(StrategyParam strategyParam);
    
        /**
         * 获取当前对象对应枚举
         * @return 策略枚举
         */
        StrategyEnum getStrategyEnum();
    }
    /**
     * @author YUFEI
     * @Date 2022/9/19 9:11
     * @Version 1.0
     */
    @Service(value = "strategyA")
    @BusinessStrategy
    public class StrategyA implements Strategy {
        @Override
        public AjaxResult invokeStrategy(StrategyParam strategyParam) {
    
            System.out.println("正在执行StrategyA......");
            return null;
        }
    
        @Override
        public StrategyEnum getStrategyEnum() {
            return StrategyEnum.STRATEGY_A;
        }
    }
    @Service(value = "strategyB")
    @BusinessStrategy
    public class StrategyB implements Strategy {
    
        @Override
        public AjaxResult invokeStrategy(StrategyParam strategyParam) {
    
            System.out.println("正在执行StrategyB......");
            return null;
        }
    
        @Override
        public StrategyEnum getStrategyEnum() {
            return StrategyEnum.STRATEGY_B;
        }
    }
    @Component
    public class StrategyContext {
    
        public static Map strategyMap = new ConcurrentHashMap<>(16);
    
        /**
         * 执行策略上下文
         * @param strategyParam 策略参数
         * @return 业务处理返回封装实体
         */
        public AjaxResult invokeContext(StrategyParam strategyParam){
    
            if (strategyParam == null){
                throw new IllegalArgumentException("执行策略参数不能为空");
            }
    
            // 获取策略参数中枚举实例
            StrategyEnum strategyEnum = strategyParam.getStrategyEnum();
    
            // 通过枚举实例Get对应策略类
            Strategy strategy = strategyMap.get(strategyEnum);
             if(strategy==null){
                 throw new IllegalArgumentException("策略实现类不存在");
             }
            // 执行策略方案
            return strategy.invokeStrategy(strategyParam);
        }
    }
    import com.cdkj.common.enums.StrategyEnum;
    import com.cdkj.framework.annotation.BusinessStrategy;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    /**
     * 策略类管理器
     * @author ChenErGao
     */
    @Component
    public class StrategyManage implements BeanPostProcessor {
        private final static Logger log = LoggerFactory.getLogger(StrategyManage.class);
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    
            // 一定要将Bean实例返回
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    
            // 判断Bean是否被自定义注解标示
            if (bean instanceof Strategy && bean.getClass().isAnnotationPresent(BusinessStrategy.class)){
    
                // 将策略类强转为顶层策略接口
                Strategy strategy = (Strategy) bean;
    
                StrategyEnum strategyEnum= strategy.getStrategyEnum();
                if(strategyEnum==null){
                    log.warn("######[StrategyManage]#################");
                }
                // 将策略类添加到策略Map中
                StrategyContext.strategyMap.put(strategy.getStrategyEnum(), strategy);
            }
    
            // 一定要把Bean实例返回
            return bean;
        }
    }
    /**
     * @author YUFEI
     * @Date 2022/9/19 9:11
     * @Version 1.0
     */
    public class StrategyParam {
        StrategyEnum strategyEnum;
    
        public StrategyEnum getStrategyEnum() {
            return strategyEnum;
        }
    
        public void setStrategyEnum(StrategyEnum strategyEnum) {
            this.strategyEnum = strategyEnum;
        }
    }
    
  • 相关阅读:
    15.一种坍缩式的简单——组合模式详解
    UE4打包发布后,在Windows和Android平台上访问非Asset文件
    vue3实现在element Dialog 对话框中预览pdf文件
    C#绘制带控制点的Bezier曲线,用于点阵图像及矢量图形
    NTT 的各类优化
    【QML】报错 DelegateModel :: index out range xx xx
    区分dom对象和jQuery对象、jQuery对象的本质、jQuery对象和dom对象使用的区别和相互转换
    javascripe :验证是否已存在
    一个简单的mini strace工具以及strace原理
    理论STL——vector篇(小Z 著)
  • 原文地址:https://blog.csdn.net/qq_39716220/article/details/126946937