支付业务实战对复杂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 判断了。
##  总结
目录
相关文章
|
SQL 存储 数据库
关系数据库:关系运算
关系数据库:关系运算
872 5
关系数据库:关系运算
|
架构师 安全 程序员
软考资料-分享
本文提供了计算机软考资源分享,包括高级、中级和初级三个层次的专业课程。高级课程如系统架构师、网络规划设计师等,中级课程如网络工程师、数据库系统工程师等,初级课程如网络管理员、程序员等,覆盖了多种专业方向,适合不同水平的学习者。
5955 0
|
uml C++ 容器
「软件设计」UML中关联,聚合和组合的区别是什么?
「软件设计」UML中关联,聚合和组合的区别是什么?
|
编解码 Java 应用服务中间件
修改idea的临时数据存放目录(默认保存在C盘用户目录下的.IntelliJIdea2020.3)
修改idea的临时数据存放目录(默认保存在C盘用户目录下的.IntelliJIdea2020.3)
1320 0
修改idea的临时数据存放目录(默认保存在C盘用户目录下的.IntelliJIdea2020.3)
|
Java Spring
Spring 代理 Bean 中获取不到原始 Bean 对象注解的解决方法
我在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。 所以我需要对 consumer 对象进行代理,然后如果超过异常次数,我直接返回成功,并且发送成功消息,但是我获取 consumer handler 方法的方式是通过 method.getAnnotation(XXClient.class) 方式,那么就会返回 null。
813 0
|
13天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
5天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI