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

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

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

相关推荐
松仔log25 分钟前
JetPack——Paging3+Room
android·java·zoom
Lei活在当下6 小时前
先用起来,再理解,关于协程Coroutine应该知道的事
android·java·jvm
kernelcraft6 小时前
cuongpmyoutube-dl-android:多平台视频下载的Android客户端
android·其他
佚泽7 小时前
Android Studio 如何配置gradle
android·ide·android studio
苏坡余10 小时前
Android Pixel7 13.0 HAL Service 调试
android
私人珍藏库10 小时前
【Android】AI视频剪辑-Ai剪辑视频 免费无广告
android·app·工具·软件·多功能
乐活青年11 小时前
新版Android Studio不显示gradle task list 问题
android·ide·android studio
alphageek811 小时前
JeffMony开源的VideoDownloader,Android平台视频下载SDK
android·其他·开源·音视频
亚空间仓鼠12 小时前
Docker容器化高可用架构部署方案(十五)
android·redis·docker·架构·sentinel
oh_my_god12 小时前
增加系统白名单,允许普通APP调用Android系统内部隐藏方法
android·framework