策略模式+模板方法+工厂模式最佳实践

本文介绍了如何使用Java创建一个通用的HttpRequestTemplate,该模板根据不同的平台(如Amazon、淘宝、拼多多)提供定制化的请求URL、头和体,利用PlatformAction接口和Factory进行灵活扩展。
摘要由CSDN通过智能技术生成

最佳实践:

场景

1、对接多个平台功能。

​ 有一个功能需要对接多个平台接口,获取每个平台上客户自己的订单。亚马逊平台、淘宝平台、拼多多等。

这个时候我们的请求步骤都是一样的。请求的行为根据不同的平台有不同的参数设置

模板类

package org.example.strategyAndTemplate;

import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;

import javax.annotation.Resource;
import java.util.HashMap;

/**
 * @author huangZhiLin
 */
public  class HttpRequestTemplate {

    @Resource
    PlatformActionFactory platformActionFactory;

    public String doHttpRequest(String platformCode, String params){
        //1、获取平台请求地址
        String url = getUrl(platformCode);

        //获取平台请求头
        HashMap<String, String> requestHead = getRequestHead(platformCode);

        //获取平台请求体
        String requestBody = getRequestBody(platformCode,params);

        //发送请求
        HttpResponse response = HttpUtil.createPost(url).addHeaders(requestHead).body(requestBody).execute();

        //处理请求结果,并返回
        return handlResult(platformCode,response);
    }

    private String handlResult(String platformCode, HttpResponse response) {
        PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
        return platformAction.handleResult(response.body());
    }

    private String getRequestBody(String platformCode, String params) {
        PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
        return platformAction.getRequestBody(platformCode, params);
    }

    private HashMap<String, String> getRequestHead(String platformCode) {
        PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
        return platformAction.getRequestHead(platformCode);
    }

    private String getUrl(String platformCode) {
        PlatformAction platformAction = platformActionFactory.getPlatformAction(platformCode);
        return platformAction.getUrl(platformCode);
    }
}

平台行为接口

package org.example.strategyAndTemplate;

import java.util.HashMap;

/**
 * @author huangZhiLin
 */
public interface PlatformAction {
    /**
     * 获取平台名称
     * @return
     */
    String getName();

    /**
     * 获取指定平台的 url
     * @return
     */
    String getUrl(String platformCode);

    /**
     * 获取指定平台请求头
     * @param platformCode
     * @return
     */
    HashMap<String, String> getRequestHead(String platformCode);

    /**
     * 获取指定平台请求体
     * @param platformCode
     * @param params
     * @return
     */
    String getRequestBody(String platformCode, String params);

    /**
     * 获取请求token
     * @param platformCode
     * @param params
     * @return
     */
    String getToken(String platformCode, String params);

    /**
     * 处理请求返回的结果
     * @param result
     * @return
     */
    String handleResult(String result);

}

平台实现类

package org.example.strategyAndTemplate;

import java.util.HashMap;

/**
 * @author huangZhiLin
 */
public class EbayAction implements PlatformAction{
    @Override
    public String getName() {
        return "EBAY";
    }

    @Override
    public String getUrl(String platformCode) {
        return "https://ebay.com";
    }

    @Override
    public HashMap<String, String> getRequestHead(String platformCode) {
        return new HashMap<>();
    }

    @Override
    public String getRequestBody(String platformCode, String params) {
        return "body";
    }

    @Override
    public String getToken(String platformCode, String params) {
        return "token";
    }

    @Override
    public String handleResult(String result) {
        
        //处理请求
        
        return "success";
    }
}

平台行为工厂

package org.example.strategyAndTemplate;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author huangZhiLin
 */
@Component
public class PlatformActionFactory implements ApplicationContextAware {

    private Map<String, PlatformAction> platformActionMap;


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, PlatformAction> actionMap = applicationContext.getBeansOfType(PlatformAction.class);
        platformActionMap = new HashMap<>();
        actionMap.forEach((key, value) -> platformActionMap.put(value.getName(), value));

    }

    public PlatformAction getPlatformAction(String platformCode){
        return platformActionMap.get(platformCode);
    }
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值