背景
最近在做項目的時候,需要接入支付。由於接入第三方支付而且還不知止一家,需要接入很多家。比如說支付寶、微信、富友支付等。每家支付都一個回調。現如今的代碼,根據不同的第三方支付一大堆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 往下寫,如果十幾家怎麼辦?所以這個要進行優化。
優化步驟
- 創建一個支付接口,提供兩個方法
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 判斷了。