支付业务实战对复杂if else 判断的优化

简介: 支付业务实战对复杂if else 判断的优化

背景

最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不知止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的第三方支付一大堆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. 创建一个支付接口,提供两个方法 <br/>
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;
}
然后准备一个工厂把那些判断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 判断了。
##  总结
目录
相关文章
|
6月前
|
弹性计算 监控 Serverless
函数计算产品使用问题之如何处理银行转账场景遇到的高并发问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
编解码
重构支付宝商家账单问题之在重构过程中,替换老账单如何操作
重构支付宝商家账单问题之在重构过程中,替换老账单如何操作
|
7月前
|
移动开发
交易链路设计原则&模式问题之在订单管理系统中,doOp接口实现多种按钮操作,如何解决
交易链路设计原则&模式问题之在订单管理系统中,doOp接口实现多种按钮操作,如何解决
|
9月前
|
消息中间件 架构师 NoSQL
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
我们在美团 APP 下单,假如没有立即支付,进入订单详情会显示倒计时,如果超过支付时间,订单就会被自动取消。 这篇文章,笔者想以架构师的视角,深入剖析如何设计订单超时自动取消的功能。
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
|
9月前
|
存储 人工智能 分布式计算
swap去中心化交易系统开发|详情规则|设计原理
Web3.0的技术支撑包括区块链技术、人工智能、物联网、去中心化存储、加密算法、分布式计算等。
|
9月前
|
消息中间件 NoSQL 中间件
关于实现订单超时的几种方案(详细细节版)
关于实现订单超时的几种方案(详细细节版)
220 0
关于实现订单超时的几种方案(详细细节版)
|
Java Spring
统计业务方法耗时【项目 商城】
统计业务方法耗时【项目 商城】
133 0
统计业务方法耗时【项目 商城】
|
消息中间件 存储 资源调度
订单超时处理的几种方案及分析
描述业务常见的订单超时处理的几种方案及分析
32107 19
订单超时处理的几种方案及分析
|
存储 监控 供应链
聊聊「订单」业务的设计与实现
订单业务一直都是系统研发中的核心模块,订单的产生过程,与系统中的很多模块都会高度关联,比如账户体系、支付中心、运营管理等,即便单看订单本身,也足够的复杂;
11780 3
聊聊「订单」业务的设计与实现
|
消息中间件 Java RocketMQ
支付业务服务端测试|学习笔记
快速学习支付业务服务端测试
137 0
支付业务服务端测试|学习笔记

热门文章

最新文章