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

如何在Node.js中使用策略模式消除多分支if-else实现不同REST调用

策略模式改造方案

完全可以通过策略模式消除上述if-else分支,同时还能优化claimRepo内部的重复代码,提升后续功能扩展的效率,具体实现步骤如下:


步骤1:优化ClaimRepo类,消除内部重复逻辑

原ClaimRepo内三个查询方法的响应结构、请求逻辑完全一致,仅查询地址和入参不同,先封装通用请求方法减少重复代码:

class ClaimRepo {
  // 私有通用请求方法,复用请求、响应组装逻辑
  async #sendQueryRequest(url) {
    const data = await requests.get(url)
    return {
      data,
      statusCode
    }
  }

  async findDetailsByMembership(memberNumber) {
    return this.#sendQueryRequest('会员查询接口地址')
  }

  async findDetailsByClaim(claimNumber) {
    return this.#sendQueryRequest('索赔单查询接口地址')
  }

  async findDetailsByDate(date) {
    return this.#sendQueryRequest('日期维度查询接口地址')
  }
}

步骤2:构建策略映射替换if-else分支

通过对象映射把type取值和对应的查询逻辑绑定,直接通过key匹配对应处理逻辑,彻底消除分支判断:

// 定义策略映射:key为type的取值,value为对应查询逻辑
const queryStrategy = {
  'Membership': (memberNumber) => claimRepo.findDetailsByMembership(memberNumber),
  'Claim': (claimNumber) => claimRepo.findDetailsByClaim(claimNumber),
  'Date': (date) => claimRepo.findDetailsByDate(date)
}

// 校验查询类型合法性
if (!queryStrategy[type]) {
  throw new Error(`不支持的查询类型:${type}`)
}

// 一行代码完成调用,替代原有多行if-else
const response = await queryStrategy[type](queryParam)

注:如果上下文内三个查询参数(memberNumber/claimNumber/date)同时存在,也可以直接把三个参数都传入策略方法,每个策略只会取用自己需要的参数即可。


进阶优化:把策略集成到ClaimRepo内部(可选)

如果不需要对外暴露多个查询方法,可以把策略映射封装到ClaimRepo内部,对外仅提供统一查询入口,代码内聚性更高:

class ClaimRepo {
  async #sendQueryRequest(url) {
    const data = await requests.get(url)
    return {
      data,
      statusCode
    }
  }

  // 私有策略映射
  #innerStrategy = {
    'Membership': (memberNumber) => this.#sendQueryRequest('会员查询接口地址'),
    'Claim': (claimNumber) => this.#sendQueryRequest('索赔单查询接口地址'),
    'Date': (date) => this.#sendQueryRequest('日期维度查询接口地址')
  }

  // 对外统一查询入口
  async findDetails(type, queryParam) {
    if (!this.#innerStrategy[type]) {
      throw new Error(`不支持的查询类型:${type}`)
    }
    return this.#innerStrategy[type](queryParam)
  }
}

// 外部调用方式
const response = await claimRepo.findDetails(type, queryParam)

内容的提问来源于stack exchange,提问作者Naxi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:04