如何在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
相关产品推荐
相关产品推荐

