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;
}
}
spring策略模式
原创
©著作权归作者所有:来自51CTO博客作者mb5f199d99afeb3的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:集合线程执行
下一篇:微信用户免密免验证码登录
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
设计模式-策略模式
设计模式之策略模式
策略模式 设计模式 -
行为设计模式-策略模式的优缺点
优点-各自使用封装的算法,可以容易地引入新的算法来满足相同的接口-算法的细节完全封装在 Strategy 类中,因此可以在不影响 Context 类的情况下更改算法的实现-由于实现的是同一个接口,所以策略之间可以自由切换缺点:-客户端必须知道所有的策略,了解它们之间的区别,以便选择恰当的算法
设计模式 行为设计模式-策略模式 C++类与对象 C++继承与多态 C++析构函数