1.创建自动配置类
public class DesignPatternAutoConfiguration {
@Autowired
private ApplicationContext context;
/**
* 策略模式选择器
*/
@Bean
public AbstractStrategyChoose abstractStrategyChoose() {
return new AbstractStrategyChoose(context);
}
}
2.spring.facotries添加自动配置类
3.创建策略选择器
/**
* 策略模式选择器
*/
@Configuration
public class AbstractStrategyChoose implements InitializingBean {
private ApplicationContext context;
/**
* 执行策略集合
*/
private final Map<String, AbstractExecuteStrategy> abstractExecuteStrategyMap = new HashMap<>();
public AbstractStrategyChoose(ApplicationContext context) {
this.context = context;
}
/**
* 根据 mark 查询具体策略
*
* @param mark 策略标识
* @return 实际执行策略
*/
public AbstractExecuteStrategy choose(String mark) {
return Optional.ofNullable(abstractExecuteStrategyMap.get(mark)).orElseThrow(() ->
new ServiceException(String.format("[%s] 策略未定义", mark)));
}
/**
* 根据 mark 查询具体策略并执行
*
* @param mark 策略标识
* @param requestParam 执行策略入参
* @param <REQUEST> 执行策略入参范型
*/
public <REQUEST> void chooseAndExecute(String mark, REQUEST requestParam) {
AbstractExecuteStrategy executeStrategy = choose(mark);
executeStrategy.execute(requestParam);
}
/**
* 根据 mark 查询具体策略并执行,带返回结果
*
* @param mark 策略标识
* @param requestParam 执行策略入参
* @param <REQUEST> 执行策略入参范型
* @param <RESPONSE> 执行策略出参范型
* @return
*/
public <REQUEST, RESPONSE> RESPONSE chooseAndExecuteResp(String mark, REQUEST requestParam) {
AbstractExecuteStrategy executeStrategy = choose(mark);
return (RESPONSE) executeStrategy.executeResp(requestParam);
}
@Override
public void afterPropertiesSet() throws Exception {
Map<String, AbstractExecuteStrategy> actual = context.getBeansOfType(AbstractExecuteStrategy.class);
actual.forEach((beanName, bean) -> {
AbstractExecuteStrategy beanExist = abstractExecuteStrategyMap.get(bean.mark());
if (beanExist != null) {
throw new ServiceException(String.format("[%s] Duplicate execution policy", bean.mark()));
}
abstractExecuteStrategyMap.put(bean.mark(), bean);
});
}
}
4.创建策略执行抽象接口
public interface AbstractExecuteStrategy<REQUEST, RESPONSE> {
/**
* 执行策略标识
*/
String mark();
/**
* 执行策略
*
* @param requestParam 执行策略入参
*/
default void execute(REQUEST requestParam) {
}
/**
* 执行策略,带返回值
*
* @param requestParam 执行策略入参
* @return 执行策略后返回值
*/
default RESPONSE executeResp(REQUEST requestParam) {
return null;
}
}
5.使用
创建策略处理Handler实现策略抽象执行接口即可对其添加相应标记,执行方法重写 注入策略选择器即可使用