利用责任链模式解耦多平台(美团/饿了么)霸王餐接口的适配逻辑
在构建支持多外卖平台(如美团、饿了么)的"霸王餐"营销系统时,不同平台的接口协议、认证方式、参数结构差异显著。若将各平台逻辑硬编码在业务方法中,会导致代码高度耦合、难以维护和扩展。责任链模式(Chain of Responsibility Pattern) 能有效解耦平台适配逻辑,使系统具备良好的可扩展性与清晰的职责划分。本文将基于 Java 实现一个支持美团与饿了么的霸王餐核销服务,并展示如何通过责任链动态路由请求。
定义统一请求与响应模型
首先抽象出平台无关的业务请求与结果:
java
package juwatech.cn.model;
public class FreeMealRequest {
private String platform; // "meituan" 或 "eleme"
private String orderId;
private String userId;
private String activityId;
// getters and setters
}
public class FreeMealResult {
private boolean success;
private String message;
private String thirdPartyOrderId;
// constructors, getters and setters
}

抽象处理器基类
定义责任链节点的通用接口与抽象基类:
java
package juwatech.cn.handler;
import juwatech.cn.model.FreeMealRequest;
import juwatech.cn.model.FreeMealResult;
public abstract class FreeMealHandler {
protected FreeMealHandler nextHandler;
public void setNext(FreeMealHandler handler) {
this.nextHandler = handler;
}
public FreeMealResult handle(FreeMealRequest request) {
if (supports(request)) {
return doHandle(request);
}
if (nextHandler != null) {
return nextHandler.handle(request);
}
throw new UnsupportedOperationException("Unsupported platform: " + request.getPlatform());
}
protected abstract boolean supports(FreeMealRequest request);
protected abstract FreeMealResult doHandle(FreeMealRequest request);
}
美团平台适配器实现
java
package juwatech.cn.handler.impl;
import juwatech.cn.handler.FreeMealHandler;
import juwatech.cn.model.FreeMealRequest;
import juwatech.cn.model.FreeMealResult;
import juwatech.cn.client.MeituanApiClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MeituanFreeMealHandler extends FreeMealHandler {
@Autowired
private MeituanApiClient meituanClient;
@Override
protected boolean supports(FreeMealRequest request) {
return "meituan".equalsIgnoreCase(request.getPlatform());
}
@Override
protected FreeMealResult doHandle(FreeMealRequest request) {
try {
String response = meituanClient.verifyFreeMeal(
request.getOrderId(),
request.getUserId()
);
return new FreeMealResult(true, "Success", extractThirdOrderId(response));
} catch (Exception e) {
return new FreeMealResult(false, "Meituan API error: " + e.getMessage(), null);
}
}
private String extractThirdOrderId(String response) {
// 解析美团返回的JSON获取订单ID
return "MT_" + System.currentTimeMillis();
}
}
饿了么平台适配器实现
java
package juwatech.cn.handler.impl;
import juwatech.cn.handler.FreeMealHandler;
import juwatech.cn.model.FreeMealRequest;
import juwatech.cn.model.FreeMealResult;
import juwatech.cn.client.ElemeApiClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ElemeFreeMealHandler extends FreeMealHandler {
@Autowired
private ElemeApiClient elemeClient;
@Override
protected boolean supports(FreeMealRequest request) {
return "eleme".equalsIgnoreCase(request.getPlatform());
}
@Override
protected FreeMealResult doHandle(FreeMealRequest request) {
try {
String token = elemeClient.getAccessToken();
String response = elemeClient.verifyTrialMeal(
token,
request.getActivityId(),
request.getOrderId()
);
return new FreeMealResult(true, "Success", extractElemeOrderId(response));
} catch (Exception e) {
return new FreeMealResult(false, "Eleme API error: " + e.getMessage(), null);
}
}
private String extractElemeOrderId(String response) {
return "EL_" + System.currentTimeMillis();
}
}
责任链装配与调用入口
通过 Spring 配置组装责任链:
java
package juwatech.cn.config;
import juwatech.cn.handler.FreeMealHandler;
import juwatech.cn.handler.impl.ElemeFreeMealHandler;
import juwatech.cn.handler.impl.MeituanFreeMealHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HandlerChainConfig {
@Bean
public FreeMealHandler freeMealHandlerChain(MeituanFreeMealHandler meituan,
ElemeFreeMealHandler eleme) {
meituan.setNext(eleme);
return meituan;
}
}
业务服务中注入链头并调用:
java
package juwatech.cn.service;
import juwatech.cn.handler.FreeMealHandler;
import juwatech.cn.model.FreeMealRequest;
import juwatech.cn.model.FreeMealResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class FreeMealService {
@Autowired
private FreeMealHandler handlerChain;
public FreeMealResult processFreeMeal(FreeMealRequest request) {
return handlerChain.handle(request);
}
}
新增平台的扩展方式
当未来需接入"京东到家"等新平台时,只需:
- 新增
JddjFreeMealHandler extends FreeMealHandler - 实现
supports与doHandle - 在
HandlerChainConfig中将其加入链尾
无需修改现有业务逻辑,符合开闭原则。
本文著作权归吃喝不愁app开发者团队,转载请注明出处!