利用责任链模式解耦多平台(美团/饿了么)霸王餐接口的适配逻辑

利用责任链模式解耦多平台(美团/饿了么)霸王餐接口的适配逻辑

在构建支持多外卖平台(如美团、饿了么)的"霸王餐"营销系统时,不同平台的接口协议、认证方式、参数结构差异显著。若将各平台逻辑硬编码在业务方法中,会导致代码高度耦合、难以维护和扩展。责任链模式(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);
    }
}

新增平台的扩展方式

当未来需接入"京东到家"等新平台时,只需:

  1. 新增 JddjFreeMealHandler extends FreeMealHandler
  2. 实现 supportsdoHandle
  3. HandlerChainConfig 中将其加入链尾

无需修改现有业务逻辑,符合开闭原则。

本文著作权归吃喝不愁app开发者团队,转载请注明出处!

相关推荐
工程师老罗6 小时前
如何在Android工程中配置NDK版本
android
书院门前细致的苹果9 小时前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
Libraeking10 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位10 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen12312 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs13 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob13 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔13 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99613 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly15 小时前
md模拟器安卓版带金手指2026
android