背景

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

最新文章

  1. Linux内核【链表】整理笔记(2)
  2. 突破自我,开源NetWorkSocket通讯组件
  3. sass+compass+bootstrap三剑合璧高效开发记录
  4. linux上操作mysql数据库
  5. Unity3D的LightProbe动态光探头用法介绍
  6. Magento中直接使用SQL语句
  7. jquery 提示信息显示后自动消失的具体实现
  8. USB HID介绍
  9. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ
  10. Android中的shape
  11. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
  12. 8Manage:专注企业级CRM服务应用
  13. 都 9012了,该选择 Angular、React,还是Vue?
  14. 【ABP.Net】2.多数据库支持&amp;&amp;初始化数据库
  15. 一、cryptsetup文件系统加密
  16. 在linux环境下部署禅道环境
  17. springboot 简单搭建
  18. JavaScript 作用域链其实很简单
  19. Java微信二次开发(七)
  20. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)

热门文章

  1. 五. Webpack详解
  2. 15_Android文件读写操作
  3. PyQt(Python+Qt)学习随笔:使用QColorDialog.getColor交互设置部件的颜色
  4. Python正则表达式\W+和\W*匹配过程的深入分析
  5. java8+ Lambda表达式基本用法
  6. 题解-CF643G Choosing Ads
  7. Ionic学习记录
  8. 代理ip知识
  9. Day3 条件判断和循环
  10. clang-format 数组初始化,多行模式