page contents

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

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

attachments-2021-03-1xbhikuw604b09f579e81.png

前言

在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多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进行扩展,代码会比较冗余,如果本来就没几行代码,缺强制使用策略模式,无意是画蛇添足。


attachments-2021-03-qT67IJSB604b0a120c31f.jpg来源:https://blog.csdn.net/qq_30285985/

  • 发表于 2021-03-12 14:27
  • 阅读 ( 572 )
  • 分类:中间件

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1482 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章