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

共 5442字,需浏览 11分钟

 ·

2021-04-06 20:01


上一篇:3600万中国人在抖音“上清华”

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

前言

在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多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进行扩展,代码会比较冗余,如果本来就没几行代码,缺强制使用策略模式,无意是画蛇添足。
看完这篇文章,你有什么收获?欢迎在留言区与10w+Java开发者一起讨论~

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。


猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享


浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报