一个支付案例,学会策略模式!

Posted Java技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个支付案例,学会策略模式!相关的知识,希望对你有一定的参考价值。

作者:叁滴水\\
博客:https://blog.csdn.net/qq_3028...

前言

在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多if/else来进行判断,但是业务逻辑的逐渐增多,if/else显得那么的沉重,通过策略模式即可更优雅的来处理这种代码。

什么是策略模式呢?比如一个人要从广州去北京,这个人可以选择乘坐飞机去,也可以选择乘坐火车去。两种交通方式的选择,可以认为是两种策略。映射到程序中,可以认为是两种算法,比如支付的时候,选择支付宝支付或者微信支付。

策略模式的特点是不管过程怎么样,结果都是一样的。不管乘坐飞机还是火车,最后都会到达北京;不管哪种支付方式,最终都会支付成功。过程不一样,结果都一样。

一、支付案例

支付时,会有很多参数,很多逻辑,经常会遇到一种支付方式,上百行的代码,而且还需要很好的把控事务。如果多种支付方式,代码也会成倍的上涨。维护起来相当难受。

1.普通代码

代码如下(示例):

@PostMapping("/makeOrder")
public ResultData makeOrder(@RequestBody  Order order){
    // 生成自己的订单,并且设置订单的失效时间,并且定时回滚
    //  ... 此处代码省略

    // 处理支付方式
    if(order.getType=="alipay"){ // 支付宝
        this.payService.alipay(order);
    }else if (order.getType=="weixin"){ // 微信
        this.payService.weixinpay(order);
    }else if (order.getType=="jd"){ // 京东支付
        this.payService.jtpay(order);
    }else if (order.getType=="yunshanfu"){ // 云闪付
        this.payService.yunshanfupay(order);
    }
    // 发送到mq,进行广播。
    return this.ok(order);
}

相信代码肯定会很多,而且if/else来处理会显得代码很杂乱。或者有通过增加接口来减少if/else

@PostMapping("/alipay")
public ResultData makeOrder(@RequestBody  Order order){

}
@PostMapping("/jdpay")
public ResultData makeOrder(@RequestBody  Order order){

}

现在逻辑少,代码不会显得杂乱,如果有很多种支付方式呢?代码会显得很杂乱,而且扩展受限。

2.引入策略模式

代码如下(入口):

private OrderService orderService;

@PostMapping("/makeOrder")
// 商品id
// 支付类型
public ResultData makeOrder(Long goodsId,String type){
    // 生成本地的订单
    Order order = this.orderService.makeOrder(goodsId);
    //选择支付方式
    PayType payType = PayType.getByCode(type);
    //进行支付
    payType.get().pay(order.getId(),order.getAmount());
    return this.ok();
}

代码如下(支付方式):

public enum PayType {
    //支付宝        AliPay 是实现类
    ALI_PAY("1",new AliPay()),
    //微信
    WECHAT_PAY("2",new WechatPay());

    private String payType;
    // 这是一个接口
    private Payment payment;
    PayType(String payType,Payment payment){
        this.payment = payment;
        this.payType = payType;
    }
    //通过get方法获取支付方式
    public Payment get(){ return  this.payment;}
    
    public static PayType getByCode(String payType) {
        for (PayType e : PayType.values()) {
            if (e.payType.equals(payType)) {
                return e;
            }
        }
        return null;
    }
}

代码如下(支付接口):

public interface Payment {
    public void pay(Long order, double amount);
}

代码如下(支付宝支付实现):

public class AliPay implements Payment {
    @Override
    public void pay(Long order, double amount) {
        System.out.println("----支付宝支付----");
        System.out.println("支付宝支付111元");
    }
}

代码如下(微信支付实现):

public class WechatPay implements Payment {
    @Override
    public void pay(Long orderId, double amount) {
        System.out.println("---微信支付---");
        System.out.println("支付222元");
    }
}

通过枚举来优雅的选择支付类型,共用一个支付接口,不同的支付方式实现自己的逻辑,更加贴合面向对象的思想。这种方式相对与if/else更加优雅。

但是,其实这样一看,哇,使用策略模式,创建了好多类,好麻烦的样子,还是使用if/else代码少一点,但是长远来说,支付的逻辑一定是错综复杂,通过策略模式可以更加友好的进行扩展。但是if/else进行扩展,代码会比较冗余,如果本来就没几行代码,缺强制使用策略模式,无意是画蛇添足。

另外,想学习更多的策略模式,可以关注公众号Java技术栈,在后台回复:设计模式,可以获取我整理的设计模式教程,都是实战干货。

本文来自作者「叁滴水」投稿,谢谢分享,也欢迎爱好技术分享的各位技术朋友向「Java技术栈」投稿,让更多人看到,投稿方式:关注公众号「Java技术栈」在后台回复:投稿。

近期热文推荐:

1.600+ 道 Java面试题及答案整理(2021最新版)

2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

以上是关于一个支付案例,学会策略模式!的主要内容,如果未能解决你的问题,请参考以下文章

策略模式的使用

经典设计模式之策略模式如何重构聚合支付平台,对接支付宝,微信,银联支付

设计模式 - 策略模式

JAVA设计模式之策略模式

一把 LOL 案例,学会模板设计模式!

案例分析:设计模式与代码的结构特性