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;
}
}