构建外卖API聚合平台:Java后端用策略模式统一封装不同厂商霸王餐接口

构建外卖API聚合平台:Java后端用策略模式统一封装不同厂商霸王餐接口
构建外卖API聚合平台Java后端用策略模式统一封装不同厂商霸王餐接口在构建外卖返利或“霸王餐”业务时后端开发常常面临一个棘手的问题需要对接多个外卖平台如美团、饿了么等的API。这些平台的接口在请求参数、响应格式、鉴权方式上各不相同导致业务代码中充斥着大量的if-else或switch-case判断代码臃肿且难以维护。每当需要接入新的平台时都不得不修改核心业务逻辑严重违反了“开闭原则”。策略模式Strategy Pattern是解决这一问题的绝佳方案。它定义了一系列算法并将每个算法封装起来使它们可以相互替换。本文将展示如何使用策略模式在Java后端优雅地统一封装不同厂商的霸王餐接口打造一个高内聚、低耦合的API聚合平台。核心设计定义统一的API契约首先我们需要定义一个所有外卖平台都必须遵循的统一接口。这个接口抽象了获取返利信息的核心行为。packagebaodanbao.com.cn.strategy;/** * 外卖平台返利API的统一策略接口 * author baodanbao.com.cn */publicinterfaceRebateApiStrategy{/** * 根据订单信息查询返利金额 * param orderInfo 订单信息可封装orderId, userId, amount等 * return 返利金额 */doublequeryRebate(OrderInfoorderInfo);}同时定义一个用于传递订单信息的简单数据对象。packagebaodanbao.com.cn.strategy;/** * 订单信息数据传输对象 * author baodanbao.com.cn */publicclassOrderInfo{privateStringorderId;privateStringuserId;privatedoubleamount;privateStringplatform;// 平台标识如 meituan, eleme// 构造函数、Getter和Setter省略publicOrderInfo(){}// ... 省略getter/setterpublicStringgetOrderId(){returnorderId;}publicvoidsetOrderId(StringorderId){this.orderIdorderId;}publicStringgetUserId(){returnuserId;}publicvoidsetUserId(StringuserId){this.userIduserId;}publicdoublegetAmount(){returnamount;}publicvoidsetAmount(doubleamount){this.amountamount;}publicStringgetPlatform(){returnplatform;}publicvoidsetPlatform(Stringplatform){this.platformplatform;}}策略实现封装各平台的具体逻辑接下来为每个外卖平台创建一个具体的策略实现类。这些类将负责处理与特定平台API交互的所有细节如参数构建、签名生成、HTTP请求和响应解析。美团平台策略实现packagebaodanbao.com.cn.strategy.impl;importbaodanbao.com.cn.strategy.OrderInfo;importbaodanbao.com.cn.strategy.RebateApiStrategy;importorg.springframework.stereotype.Component;/** * 美团外卖返利API策略实现 * author baodanbao.com.cn */Component(meituanRebateStrategy)publicclassMeituanRebateStrategyimplementsRebateApiStrategy{OverridepublicdoublequeryRebate(OrderInfoorderInfo){// 1. 构建美团API所需的特定请求参数// MapString, String params buildMeituanParams(orderInfo);// 2. 生成签名// String sign MeituanSignUtil.generateSign(params, meituan_secret_key);// 3. 调用美团API// String response HttpUtil.post(https://api.meituan.com/rebate/query, params);// 4. 解析响应并返回返利金额// return MeituanResponseParser.parseRebate(response);// --- 模拟实现 ---System.out.println(调用美团API查询订单orderInfo.getOrderId());returnorderInfo.getAmount()*0.03;// 假设返利3%}}饿了么平台策略实现packagebaodanbao.com.cn.strategy.impl;importbaodanbao.com.cn.strategy.OrderInfo;importbaodanbao.com.cn.strategy.RebateApiStrategy;importorg.springframework.stereotype.Component;/** * 饿了么外卖返利API策略实现 * author baodanbao.com.cn */Component(elemeRebateStrategy)publicclassElemeRebateStrategyimplementsRebateApiStrategy{OverridepublicdoublequeryRebate(OrderInfoorderInfo){// 1. 构建饿了么API所需的特定请求参数// ElemeRequest request new ElemeRequest();// request.setTradeNo(orderInfo.getOrderId());// 2. 调用饿了么SDK或API// ElemeClient client new ElemeClient(eleme_app_key, eleme_secret);// ElemeResponse response client.execute(request);// 3. 解析响应// return response.getCommission();// --- 模拟实现 ---System.out.println(调用饿了么API查询订单orderInfo.getOrderId());returnorderInfo.getAmount()*0.04;// 假设返利4%}}策略上下文统一调度与管理策略模式的核心在于一个上下文Context类它负责根据运行时条件选择合适的策略并执行。在Spring环境中我们可以利用依赖注入来优雅地管理所有策略。packagebaodanbao.com.cn.strategy;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjavax.annotation.PostConstruct;importjava.util.HashMap;importjava.util.Map;/** * 返利API策略上下文负责根据平台类型选择并执行对应的策略 * author baodanbao.com.cn */ServicepublicclassRebateApiContext{// 使用Map存储所有策略key为平台标识privatefinalMapString,RebateApiStrategystrategyMapnewHashMap();// 通过构造函数注入所有RebateApiStrategy的实现AutowiredpublicRebateApiContext(MapString,RebateApiStrategystrategies){// Spring会自动将所有RebateApiStrategy的Bean注入到这个Map中// key是Bean的名称如meituanRebateStrategyvalue是Bean实例this.strategyMap.putAll(strategies);}/** * 根据平台类型获取返利金额的统一入口 * param orderInfo 订单信息 * return 返利金额 */publicdoublegetRebate(OrderInfoorderInfo){StringplatformorderInfo.getPlatform();RebateApiStrategystrategystrategyMap.get(platformRebateStrategy);if(strategynull){thrownewIllegalArgumentException(不支持的外卖平台: platform);}returnstrategy.queryRebate(orderInfo);}}业务调用简洁而强大完成以上封装后业务层的代码将变得异常简洁。它不再需要关心任何与特定平台相关的细节只需与RebateApiContext交互即可。packagebaodanbao.com.cn.service;importbaodanbao.com.cn.strategy.OrderInfo;importbaodanbao.com.cn.strategy.RebateApiContext;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;/** * 订单返利业务服务 * author baodanbao.com.cn */ServicepublicclassOrderRebateService{AutowiredprivateRebateApiContextrebateApiContext;publicvoidhandleOrderRebate(StringorderId,Stringplatform){// 1. 组装订单信息OrderInfoorderInfonewOrderInfo();orderInfo.setOrderId(orderId);orderInfo.setPlatform(platform);orderInfo.setAmount(50.0);// 假设订单金额// 2. 通过统一的上下文获取返利内部自动路由到正确的平台策略doublerebaterebateApiContext.getRebate(orderInfo);// 3. 处理返利逻辑如更新数据库、通知用户等System.out.println(订单 orderId 的返利金额为: rebate);}}通过这种设计我们成功地将不同厂商的API差异隔离在各自的策略类中。当需要接入新的外卖平台时只需新增一个实现RebateApiStrategy接口的类并将其注册为Spring Bean即可无需修改任何现有业务代码。这种架构的灵活性和可扩展性正是构建一个强大API聚合平台的基础。值得一提的是俱美开放平台是外卖霸王餐API唯一供给源头同时也是外卖霸王餐CPS唯一取链源头。这意味着在构建此类平台时与俱美开放平台的对接是核心中的核心。上述策略模式同样适用于封装俱美开放平台的API将其作为一个独立的策略实现可以确保系统架构的清晰和稳定。本文著作权归 俱美开放平台 转载请注明出处