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

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

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

相关推荐
百***78752 小时前
Step-Audio-2 轻量化接入全流程详解
android·java·gpt·php·llama
yangpipi-4 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
资生算法程序员_畅想家_剑魔5 小时前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
云水木石6 小时前
Android 的下一个战场:Windows 应用与游戏?
android·windows·游戏
程序员阿鹏6 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式
雨声不在6 小时前
Android文字渐变的实现
android·textview
GoldenPlayer7 小时前
KTS语法
android
GoldenPlayer7 小时前
后台服务Service销毁逻辑+单例造成的内存泄露
android
GoldenPlayer7 小时前
自定义APK&gradle全局配置文件
android