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

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

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

相关推荐
黄林晴1 分钟前
Compose Multiplatform 1.10.0 重磅发布!三大核心升级,跨平台开发效率再提升
android·android jetpack
锁我喉是吧4 分钟前
Android studio 编译faiss
android·android studio·faiss
鹏程十八少7 分钟前
3. Android 腾讯开源的 Shadow,凭什么成为插件化“终极方案”?
android·前端·面试
TheNextByte110 分钟前
如何通过蓝牙将联系人从Android传输到 iPhone
android·cocoa·iphone
Wpa.wk12 分钟前
性能测试-性能监控相关命令-基础篇
android·linux·运维·经验分享·测试工具·性能测试·性能监控
Kapaseker13 分钟前
必须要搞懂的 View 核心问题
android·kotlin
运筹vivo@22 分钟前
攻防世界: simple_php
android·php·android studio
2501_9159214327 分钟前
360移动端性能监控实践QDAS-APM(iOS篇)
android·macos·ios·小程序·uni-app·cocoa·iphone
CDwenhuohuo27 分钟前
uniapp 安卓原生截图保存到相册跟api服务器 canvas实现 plus.nativeObj.Bitmap实现
android·uni-app
感觉不怎么会28 分钟前
Android 4.4 - APN类型扩展(一)
android·开发语言·python