You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 03:48:10