1、抽象策略
public interface Strategy<T> {
/**
* 获得策略的标识
*/
T getStrategyId();
}
2、对抽象策略扩展
public interface MessageStrategy extends Strategy<String>{
void handler();
}
3、策略具体实现
@Component
public class AMessageStrategy implements MessageStrategy{
@Override
public String handler() {
return "A ...handler";
}
@Override
public String getStrategyId() {
return "A";
}
}
@Component
public class BMessageStrategy implements MessageStrategy{
@Override
public String handler() {
return "B .. handler";
}
@Override
public String getStrategyId() {
return "B";
}
}
4、抽象策略工厂
public class StrategyFactory<T,S extends Strategy<T>> implements InitializingBean, ApplicationContextAware {
private Class<S> classType;
private HashMap<T,S> strategyMap;
private ApplicationContext applicationContext;
public StrategyFactory(Class classType) {
this.classType = classType;
}
@Override
public void afterPropertiesSet() throws Exception {
Collection<S> strategyList= applicationContext.getBeansOfType(classType).values();
strategyMap=new HashMap<>(strategyList.size());
for (S strategy:strategyList){
strategyMap.put(strategy.getStrategyId(),strategy);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext=applicationContext;
}
public S getStrategy(T t){
return strategyMap.get(t);
}
}
5、策略类型配置
@Configuration
public class StrategyConfig {
@Bean
public StrategyFactory<String,MessageStrategy> getMessageStrategy(){
return new StrategyFactory<String,MessageStrategy>(MessageStrategy.class);
}
}
6、测试
@Service
public class StrategyTestService {
@Autowired
private StrategyFactory<String,MessageStrategy> strategyFactory;
public String hello(String strategyId){
MessageStrategy messageStrategy= strategyFactory.getStrategy(strategyId);
return messageStrategy.handler();
}
}
@RestController
public class StrategyController {
@Autowired
StrategyTestService strategyTestService;
@RequestMapping("/strategy")
public String strategy(String strategyId){
return strategyTestService.hello(strategyId);
}
}