背景

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

支付业务优化else if 代码的更多相关文章

  1. CssStats – 分析和优化网站 CSS 代码的利器

    CssStats 是一个在线的 CSS 代码分析工具,你只需要输入网址或者直接 CSS 地址即可进行 CSS 代码的全方位分析,是前端开发人员和网页设计师分析网站 CSS 代码的利器,可以统计出 CS ...

  2. 优化C/C++代码的小技巧

    说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序中是如何优化C/C++代码的.倒也有一些参考意义,当然有的地方我并不赞同或者说我也不完全理解,原文在 ...

  3. 优化C/C++代码的小技巧(转)

    源:http://www.cnblogs.com/lizhenghn/p/3969531.html 说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序 ...

  4. [Android] Android开发优化之——从代码角度进行优化

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就 ...

  5. CSS select样式优化 含jquery代码

    CSS 下拉选择菜单基本的CSS样式不怎么好看,通过一些简单的样式优化,可以得到如下图这样的: html结构如下: <div class="sel_wrap"> < ...

  6. 如何优化C语言代码(程序员必读)

    1.选择合适的算法和数据结构 应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍.将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序 ...

  7. 解析Android开发优化之:从代码角度进行优化的技巧

    下面我们就从几个方面来了解Android开发过程中的代码优化,需要的朋友参考下   通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说 ...

  8. ADT开发中的一些优化设置:代码背景色、代码字体大小、代码自动补全

    初学Android开发,在网上找到一些ADT工具的优化,自己设置好了,截图保存下来.免得以后忘了. 1. 设置背景颜色: 色调85.饱和度90.亮度205 RGB:199.237.204 2. 设置代 ...

  9. 深入理解Objective-C:优化你的代码

    开篇 只要用到Objective-C,我们每天都会跟方法调用打交道.我们都知道Objective-C的方法决议是动态的,但是在底层一个方法究竟是怎么找到的,方法缓存又是怎么运作的却鲜为人知. 本文主要 ...

随机推荐

  1. Potato家族本地提权分析

    原文来自SecIN社区-作者:Zeva 0x00 前言 在实际渗透中,我们用到最多的就是Potato家族的提权.本文着重研究Potato家族的提权原理以及本地提权细节 0x01 原理讲解 1.利用Po ...

  2. Jmeter-BeanShell断言的运用二(不同Json格式的字段提取和断言判断)

    前言 为了更加熟悉BeanShell,所以用几个实例来记录说明下,不同的Json格式是怎么提取相应字段和判断断言的.(会持续更新...) 一.第一种Json格式 1.Json响应数据内容如下: { & ...

  3. Cys_Control(四) MTabControl

    一.查看TabControl原样式 <ControlTemplate TargetType="{x:Type TabControl}"> <Grid x:Name ...

  4. OLLVM快速学习

    近来,ollvm在国内移动安全,尤其是安全加固上的使用越来越广泛,ollvm的混淆和反混淆也被视为比较高等的知识之一,让很多人感到无从下手,望尘莫及.如果你在google上搜索ollvm,你会发现第一 ...

  5. js中的(function(){})()立即执行

    ( function(){-} )() 和 ( function (){-} () ) 是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念. 函数声明. ...

  6. Zabbix自定义模板监控多个url接口

    一.脚本配置 1.监控脚本 /etc/zabbix/zabbix_agent2.d/scripts/web_site_code_status.sh #!/bin/bash url_discovery( ...

  7. oracle 时间段查询

    <select id="selectByRzrq" resultMap="BaseResultMap" parameterType="java. ...

  8. Javascript的解码/编码api

    1.fromCharCode() 接受一个指定的 Unicode 值,然后返回一个字符串. 语法:String.fromCharCode(numX,numX,...,numX) 详细了解:http:/ ...

  9. MySQL事务(二)事务隔离的实现原理:一致性读

    今天我们来学习一下MySQL的事务隔离是如何实现的.如果你对事务以及事务隔离级别还不太了解的话,这里左转. 好的,下面正式进入主题.事务隔离级别有4种:读未提交.读提交.可重复读和串行化.首先我们来说 ...

  10. IO 的五种模型是什么

    目录 前言 用户空间和内核空间 IO 五种模型 阻塞型 IO 非阻塞 IO IO 多路复用 信号驱动 IO 异步 IO 总结 阻塞和非阻塞 同步与异步 前言 我们经常看到阻塞/非阻塞,同步/异步这两组 ...