实现按规则调用多API子集的StartAPI,可采用何种设计模式?
解决方案:使用策略模式(结合映射表实现)
要消除StartAPI中的if-else判断,最适合的方案是策略模式,通过构建参数与API执行逻辑的映射表,直接根据输入参数分发到对应的执行策略,彻底摆脱分支判断。
具体实现步骤
封装API执行逻辑
先把各个独立API的调用逻辑封装成可复用的方法,方便后续组合:// 示例:单个API调用方法 private void InvokeApiX() { /* API_X的调用逻辑 */ } private void InvokeApiZ() { /* API_Z的调用逻辑 */ } private void InvokeApiT() { /* API_T的调用逻辑 */ } private void InvokeApiY() { /* API_Y的调用逻辑 */ } private void InvokeApiU() { /* API_U的调用逻辑 */ }构建策略映射表
创建一个字典,将输入参数(如"string1")作为key,对应的API执行组合作为value(可以用委托、lambda表达式或实现了统一接口的策略类):// 初始化映射表,建议在程序启动时完成一次初始化 private readonly Dictionary<string, Action> _apiStrategyMap = new() { ["string1"] = () => { InvokeApiX(); InvokeApiZ(); }, ["string2"] = () => { InvokeApiX(); InvokeApiZ(); }, ["string3"] = () => { InvokeApiX(); InvokeApiZ(); InvokeApiT(); }, ["string4"] = () => { InvokeApiX(); InvokeApiZ(); InvokeApiT(); InvokeApiY(); InvokeApiU(); } };简化StartAPI逻辑
在StartAPI中,直接通过参数从映射表中取出对应的执行策略并执行,无需任何分支判断:public void StartAPI(string inputParam) { if (_apiStrategyMap.TryGetValue(inputParam, out var executionStrategy)) { executionStrategy(); } else { // 处理未匹配到参数的默认逻辑(如返回错误提示) } }
方案优势
- 彻底消除if-else:代码结构更简洁,可读性更强
- 符合开闭原则:新增参数规则时,只需在映射表中添加新的键值对,无需修改
StartAPI的核心逻辑 - 逻辑解耦:每个参数对应的API组合逻辑独立,便于单独维护、测试和扩展
如果后续需要处理更复杂的场景(如异步API调用、带参数的API执行),可以将策略封装为实现统一接口的类,这是标准策略模式的进阶用法,扩展性会更强。
内容的提问来源于stack exchange,提问作者Havyia Ayv
相关产品推荐
相关产品推荐

