@ConditionalOnProperty属策略模式还是启动工厂?如何实现请求级策略切换?
问题解答
1. 当前方案属于哪种模式?
你现在用@ConditionalOnProperty的方案不属于GoF策略模式,更偏向配置驱动的Bean配置/静态工厂方式。
- GoF策略模式的核心是运行时动态选择、切换不同算法实现,客户端可以根据场景灵活替换策略实例;
- 而你的方案是在应用启动阶段就通过配置参数固定了唯一的策略Bean,服务注入后全程只能用这一个实例,完全没有运行时切换的能力,本质是启动时的配置选型,不是策略模式的动态切换逻辑。
2. 实现请求级切换的正确方式
是的,必须弃用@ConditionalOnProperty,转而注入Map<String, TreeAlgorithmStrategy>来管理所有策略实例,具体步骤如下:
第一步:注册所有策略Bean
去掉条件注解,让Spring同时管理两个实现类的Bean,也可以用@Qualifier自定义Bean的key(方便和请求参数对应):
@Bean("collections") public TreeAlgorithmStrategy collectionsStrategy() { return new CollectionsTreeAlgorithm(); } @Bean("custom") public TreeAlgorithmStrategy customStrategy() { return new CustomTreeAlgorithm(); }
第二步:在服务中注入策略Map并实现请求级切换
在业务服务里注入所有策略的Map,然后根据请求参数动态获取对应的策略执行:
@Service public class TreeService { private final Map<String, TreeAlgorithmStrategy> strategyMap; private final TreeAlgorithmStrategy defaultStrategy; // 构造函数注入,同时指定默认策略 public TreeService(Map<String, TreeAlgorithmStrategy> strategyMap) { this.strategyMap = strategyMap; this.defaultStrategy = strategyMap.get("custom"); // 沿用原来的默认逻辑 } public Object handleTreeRequest(String algoParam) { // 根据请求参数获取策略,参数为空则用默认 TreeAlgorithmStrategy strategy = Optional.ofNullable(algoParam) .map(strategyMap::get) .orElse(defaultStrategy); // 执行策略逻辑 return strategy.processTree(); } }
第三步:在控制器中接收参数并调用服务
@RestController @RequestMapping("/tree") public class TreeController { private final TreeService treeService; public TreeController(TreeService treeService) { this.treeService = treeService; } @GetMapping public Object handleTree(@RequestParam(value = "algo", required = false) String algo) { return treeService.handleTreeRequest(algo); } }
这样就能通过请求参数?algo=collections或?algo=custom动态切换策略,完全符合GoF策略模式的核心要求。
内容的提问来源于stack exchange,提问作者Eduardo Visoni
相关产品推荐
相关产品推荐

