天天看點

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<StrategyEnum, Strategy> 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;
    }
}