一个项目如何支持多种第三方对接如何实现?

简介: 一个项目如何支持多种第三方对接如何实现?

最近公司做了一个发票系统,只对接了一个第三方,但是现在要求对接多个第三方,如何提高代码的重用性减少开发量呢?

这里不得不引出设计模式了

这里想到的设计模式就是模板模式 和策略模式

每一种第三方平台都是一种策略

模板方法抽象类可以实现业务流程的整体逻辑

模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate

根据模板方法 首先梳理业务流程,确定不变的地方,不确定的方法都可以改为抽象方法。


此处省去了业务代码

大体框架如下

@Slf4j
public abstract class AbstractTableHandler<T> {
    //抽象处理发票业务
    //type 开票类型
    public JSONObject getInvoicePdfUrlpre(JSONObject param ) {
        //重新开票校验开票次数不能超过3次; 
        //判断本次开票是否是重开
        try {
            JSONObject process = process(param);
                JSONObject processAfter = processAfterc(process,param,ifchongkai);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    //b端处理结果
    public abstract JSONObject processAfterb(JSONObject process, JSONObject param, boolean ifchongkai);
    //开票B端
    public abstract JSONObject processb(JSONObject param);
    public abstract List<T> processmoney(String money,JSONObject param);
    //开票
    public abstract JSONObject process(JSONObject param)
            throws Exception;
    //处理开票结果数据
    public abstract JSONObject processAfterc(JSONObject s,JSONObject param,boolean reInvoce)
            throws Exception;
    }
}

实现一个策略Handler

@Slf4j
public class Handler extends AbstractTableHandler<FpkjxxSpmxs> {
    @Override
    public JSONObject processAfterb(JSONObject s, JSONObject param, boolean ifchongkai) {
        return s;
    }
    @Override
    public JSONObject processb(JSONObject jsonObject) {
        return JSONObject.parseObject(s);
    }
    @Override
    public List<FpkjxxSpmxs> processmoney(String money,JSONObject param) {  
        return fpkjxxSpmxsList;
    }
    @Override
    public JSONObject process(JSONObject jsonObject) throws Exception {        
        return JSONObject.parseObject(s);
    }
    @Override
    public JSONObject processAfterc(JSONObject s,JSONObject param,boolean reInvoce) throws Exception {
             return s;
    }
}

下面就是将这个策略注入spring

package com.reformer.invoice.handler;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@SuppressWarnings("rawtypes")
@Service
public class InvoiceStraegyFactory {
    @Autowired
    Map<String, AbstractTableHandler> strategys = new ConcurrentHashMap<>();
    public AbstractTableHandler getInvoiceStraegy(String invoicetype) {
        if (StringUtils.isBlank(invoicetype)) {
            return null;
        }
        AbstractTableHandler strategy = strategys.get(invoicetype);
        if (strategy == null) {
            strategy = strategys.get(invoicetype);
        }
        return strategy;
    }
}

最后就是策略调用

AbstractTableHandler<?> tableHanlder = invoiceStraegyFactory.getInvoiceStraegy(invoiceChannelCodeDao.getCode());
JSONObject invoicePdfUrlpre = tableHanlder.getInvoicePdfUrlpre(reqJson);


这样 每种不同的第三方对接是需要实现对应的Handler 就可以

其他业务逻辑代码不变

相关文章
|
XML Java API
使用 XDocReport 将 .docx 文件转换为 .pdf 文件
本文介绍如何使用 XDocReport 库在 Java 中将 Word 文件转换为 PDF 文件
5731 0
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
91169 32
超详细Netty入门,看这篇就够了!
|
9月前
|
缓存 NoSQL Java
高并发场景秒杀抢购超卖Bug实战重现
在电商平台的秒杀活动中,高并发场景下的抢购超卖Bug是一个常见且棘手的问题。一旦处理不当,不仅会引发用户投诉,还会对商家的信誉和利益造成严重损害。本文将详细介绍秒杀抢购超卖Bug的背景历史、业务场景、底层原理以及Java代码实现,旨在帮助开发者更好地理解和解决这一问题。
296 12
|
缓存 JavaScript Cloud Native
阿里云发布 Spring Boot 新脚手架,真香
本文,围绕 spring initializr 框架,以 start.spring.io 为例,全面的给大家介绍如何使用和扩展这个框架,以及背后的运行原理。
56588 1
阿里云发布 Spring Boot 新脚手架,真香
|
11月前
|
关系型数据库 MySQL Java
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
尼恩,一位40岁的资深架构师,分享了其读者群中关于DDD(领域驱动设计)的面试题及解答,涵盖DDD架构落地、微服务拆分、聚合与MySQL表的对应关系等内容。尼恩通过系统化的梳理,帮助读者在面试中展现强大的技术实力,让面试官印象深刻。此外,他还提供了《尼恩Java面试宝典》等多本技术圣经PDF,助力读者提升架构、设计和开发水平。关注【技术自由圈】公众号,获取更多资源。
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
|
XML Java API
一款直击痛点的优秀http框架,让我超高效完成了第三方接口的对接
一款直击痛点的优秀http框架,让我超高效完成了第三方接口的对接
266 0
|
Oracle Java 关系型数据库
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)
|
运维 Prometheus 监控
Spring Boot中使用Actuator监控应用状态
Spring Boot中使用Actuator监控应用状态
|
存储 供应链 Python
用Python代码打造超市收银系统
用Python代码打造超市收银系统
902 1
|
存储 NoSQL Redis
分布式限流:Redis
分布式限流:Redis
483 0