支付业务优化else if 代码

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

背景

最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的第三方支付一大堆else if判断。现如今代码如下:

 public PayResponse pay(PayRequestType payRequestType) {
PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType());
if (payType == PayTypeEnum.ALIPAY) {
return alipayService.pay(payRequestType);
} else if (payType == PayTypeEnum.WEIXIN) {
return weixinPayService.pay(payRequestType);
} else if (payType == PayTypeEnum.LIANLIAN) {
return lianlianPayService.pay(payRequestType);
}
// 其他支付方式
return null;
}

如果以后要接入其他的支付方式,然后就要接着else if 往下写,如果十几家怎么办?所以这个要进行优化。

优化步骤

  1. 创建一个支付接口,提供两个方法

public interface Pay {

PayResponse pay(PayRequestType payRequestType);

/**
* 每家支付方式对应的类型
* @return
*/

PayTypeEnum getPayType();
}```
每家支付都去实现这个类:比如微信支付

```java
@Component
public class WeixinPayService implements Pay {
@Override
public PayResponse pay(PayRequestType payRequestType) {
return null;
}

@Override
public PayTypeEnum getPayType() {
return PayTypeEnum.WEIXIN;
}

然后准备一个工厂把那些判断if else 消除掉

public final class PayFactory {
private PayFactory() {
}
public static Map<PayTypeEnum, Pay> PAYMAP = new ConcurrentHashMap();
static {
Map<String, Pay> beansOfType = ApplicationContextHelper.getBeansOfType(Pay.class);
for (Map.Entry<String, Pay> entry : beansOfType.entrySet()) {
Pay pay = entry.getValue();
PAYMAP.put(pay.getPayType(), pay);
}
}

public static Pay getPay(PayTypeEnum payTypeEnum){
return PAYMAP.get(payTypeEnum);
}

spring获取bean帮助类


@Component
public class ApplicationContextHelper implements ApplicationContextAware {

public static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}

public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
return applicationContext.getBeansOfType(clazz);
}

优化后代码

  public PayResponse pay2(PayRequestType payRequestType) {
PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType());
return PayFactory.getPay(payType).pay(payRequestType);
}

后续新增支付方式的话,只要新增枚举类型、然后实现pay接口就可以了。没有了复杂的if else 判断了。


原文始发于微信公众号(java金融):支付业务优化else if 代码