最近在作項目的時候,須要接入支付。因爲接入第三方支付並且還不知止一家,須要接入不少家。好比說支付寶、微信、富友支付等。每家支付都一個回調。現現在的代碼,根據不一樣的第三方支付一大堆else if判斷。現現在代碼以下:java
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 往下寫,若是十幾家怎麼辦?因此這個要進行優化。spring
public interface Pay { PayResponse pay(PayRequestType payRequestType); /** * 每家支付方式對應的類型 * @return */ PayTypeEnum getPayType(); }
每家支付都去實現這個類:好比微信支付微信
@Component public class WeixinPayService implements Pay { @Override public PayResponse pay(PayRequestType payRequestType) { return null; } @Override public PayTypeEnum getPayType() { return PayTypeEnum.WEIXIN; }
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幫助類app
@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); }
類型枚舉新增一個枚舉轉換方法ide
public enum PayTypeEnum { WEIXIN, LIANLIAN, ALIPAY; public static PayTypeEnum para(String type){ for(PayTypeEnum payTypeEnum:PayTypeEnum.values()){ if(type.equalsIgnoreCase(payTypeEnum.name())){ return payTypeEnum; } } return null; } }
public PayResponse pay2(PayRequestType payRequestType) { PayTypeEnum payType = PayTypeEnum.para(payRequestType.getPayType()); return PayFactory.getPay(payType).pay(payRequestType); }
後續新增支付方式的話,只要新增枚舉類型、而後實現pay接口就能夠了。沒有了複雜的if else 判斷了。微信支付
本文采用了工廠模式和巧用map的形式消除了if else的判斷。優化