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

沙海
沙海
沙海
994
文章
2
评论
2021年4月13日03:27:38
评论
3 3555字阅读11分51秒
摘要

速读摘要

速读摘要

在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多if/else来进行判断,但是业务逻辑的逐渐增多,if/else显得那么的沉重,通过策略模式即可更优雅的来处理这种代码。映射到程序中,可以认为是两种算法,比如支付的时候,选择支付宝支付或者微信支付。最近有不少老铁在后台留言说,想进大厂,但是算法不好。

原文约 1341 | 图片 5 | 建议阅读 3 分钟 | 评价反馈

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

点击关注 ? Java后端编程

点击上方“Java后端编程”,马上关注回复“666”,获取一份专属大礼包

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

作者 | 叁滴水

来源 | 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更加优雅。单例模式的 8 种写法,推荐看下。

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

最近有不少老铁在后台留言说,想进大厂,但是算法不好。最近我整理了一份刷题实录,这份刷题实录,也让我进了心仪的大厂。现在开放分享给大家。希望对大家有所帮助。任何的算法题,如同写作文一样,都有一些模板可以套用的。比如面试常考的DP(动态规划),难的是一些关键点是否能想清楚。比如你能写出动态转移方程,这题基本上就可以AC了。整个刷题实录内容,包括 双子针、动态规划、二分查找、贪心算法、深度优先搜索、字符串、递归、字典树、排序、链表等相关专题内容。图文并茂,附有刷题答案源码。他对知识点的讲解非常详细,比如这里的贪心算法,排版非常精美:目前上述内容已打包成完整电子书,具体获取方式如下:点击下面公众号卡片,关注「GitHub科技」公众号;在「GitHub科技」公众号后台回复关键词「算法」获取下载地址。

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: