編程學習網(wǎng) > 服務器 > Nginx > 一個支付案例,學會策略模式!
2021
03-12

一個支付案例,學會策略模式!

attachments-2021-03-1xbhikuw604b09f579e81.png

前言

在開發(fā)時,總會遇到支付的需求,但是支付的方式有很多,支付寶支付,微信支付,銀行卡支付,每種支付方式的接口不一樣,參數(shù)信息也不一樣,一般情況下,會有很多if/else來進行判斷,但是業(yè)務邏輯的逐漸增多,if/else顯得那么的沉重,通過策略模式即可更優(yōu)雅的來處理這種代碼。

什么是策略模式呢?比如一個人要從廣州去北京,這個人可以選擇乘坐飛機去,也可以選擇乘坐火車去。兩種交通方式的選擇,可以認為是兩種策略。映射到程序中,可以認為是兩種算法,比如支付的時候,選擇支付寶支付或者微信支付。

策略模式的特點是不管過程怎么樣,結果都是一樣的。不管乘坐飛機還是火車,最后都會到達北京;不管哪種支付方式,最終都會支付成功。過程不一樣,結果都一樣。


一、支付案例

支付時,會有很多參數(shù),很多邏輯,經(jīng)常會遇到一種支付方式,上百行的代碼,而且還需要很好的把控事務。如果多種支付方式,代碼也會成倍的上漲。維護起來相當難受。

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);
    }
    // 發(fā)送到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){
}

現(xiàn)在邏輯少,代碼不會顯得雜亂,如果有很多種支付方式呢?代碼會顯得很雜亂,而且擴展受限。

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 是實現(xiàn)類     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);
}

代碼如下(支付寶支付實現(xiàn)):

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

代碼如下(微信支付實現(xiàn)):

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

通過枚舉來優(yōu)雅的選擇支付類型,共用一個支付接口,不同的支付方式實現(xiàn)自己的邏輯,更加貼合面向對象的思想。這種方式相對與if/else更加優(yōu)雅。

但是,其實這樣一看,哇,使用策略模式,創(chuàng)建了好多類,好麻煩的樣子,還是使用if/else代碼少一點,但是長遠來說,支付的邏輯一定是錯綜復雜,通過策略模式可以更加友好的進行擴展。但是if/else進行擴展,代碼會比較冗余,如果本來就沒幾行代碼,缺強制使用策略模式,無意是畫蛇添足。


掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取