支付业务优化else if 代码
时间:2022-07-22
本文章向大家介绍支付业务优化else if 代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的第三方支付一大堆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 判断了。
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- 移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记
- Android扫描多媒体文件剖析
- Android的进程与线程使用总结
- Android在WebView中加载HTML并实现交互
- 使用ASP.NET MVC2+PDF.NET 构建一个简单的新闻管理程序 示例过程
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.3 【增加了使用说明】
- Android中Java和JavaScript交互
- Android UI控件系列:TabWidget(切换卡)
- 在Linux系统运行WinForm程序
- 将ZIP文件添加到程序集资源文件然后在运行时解压文件
- Android中App安装位置详解
- Java面试题系列之基础部分(二)——每天学5个问题
- Java面试题系列之基础部分(四)——每天学5个问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法