最近公司做了一个发票系统,只对接了一个第三方,但是现在要求对接多个第三方,如何提高代码的重用性减少开发量呢?
这里不得不引出设计模式了
这里想到的设计模式就是模板模式 和策略模式
每一种第三方平台都是一种策略
模板方法抽象类可以实现业务流程的整体逻辑
模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如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 就可以
其他业务逻辑代码不变