<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個(gè)支付案例,學(xué)會(huì)策略模式!

          共 5357字,需瀏覽 11分鐘

           ·

          2021-03-14 14:41

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

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

          前言

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

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

          策略模式的特點(diǎn)是不管過(guò)程怎么樣,結(jié)果都是一樣的。不管乘坐飛機(jī)還是火車,最后都會(huì)到達(dá)北京;不管哪種支付方式,最終都會(huì)支付成功。過(guò)程不一樣,結(jié)果都一樣。

          一、支付案例

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

          1.普通代碼

          代碼如下(示例):

          @PostMapping("/makeOrder")
          public ResultData makeOrder(@RequestBody  Order order){
              // 生成自己的訂單,并且設(shè)置訂單的失效時(shí)間,并且定時(shí)回滾
              //  ... 此處代碼省略

              // 處理支付方式
              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,進(jìn)行廣播。
              return this.ok(order);
          }

          相信代碼肯定會(huì)很多,而且if/else來(lái)處理會(huì)顯得代碼很雜亂。或者有通過(guò)增加接口來(lái)減少if/else

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

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

          }

          現(xiàn)在邏輯少,代碼不會(huì)顯得雜亂,如果有很多種支付方式呢?代碼會(huì)顯得很雜亂,而且擴(kuò)展受限。推薦閱讀:最新 Java 核心技術(shù)教程

          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);
              //進(jìn)行支付
              payType.get().pay(order.getId(),order.getAmount());
              return this.ok();
          }

          代碼如下(支付方式):

          public enum PayType {
              //支付寶        AliPay 是實(shí)現(xiàn)類
              ALI_PAY("1",new AliPay()),
              //微信
              WECHAT_PAY("2",new WechatPay());

              private String payType;
              // 這是一個(gè)接口
              private Payment payment;
              PayType(String payType,Payment payment){
                  this.payment = payment;
                  this.payType = payType;
              }
              //通過(guò)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);
          }

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

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

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

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

          通過(guò)枚舉來(lái)優(yōu)雅的選擇支付類型,共用一個(gè)支付接口,不同的支付方式實(shí)現(xiàn)自己的邏輯,更加貼合面向?qū)ο蟮乃枷搿_@種方式相對(duì)與if/else更加優(yōu)雅。單例模式的 8 種寫法,推薦看下。

          但是,其實(shí)這樣一看,哇,使用策略模式,創(chuàng)建了好多類,好麻煩的樣子,還是使用if/else代碼少一點(diǎn),但是長(zhǎng)遠(yuǎn)來(lái)說(shuō),支付的邏輯一定是錯(cuò)綜復(fù)雜,通過(guò)策略模式可以更加友好的進(jìn)行擴(kuò)展。但是if/else進(jìn)行擴(kuò)展,代碼會(huì)比較冗余,如果本來(lái)就沒(méi)幾行代碼,缺強(qiáng)制使用策略模式,無(wú)意是畫蛇添足。

          另外,想學(xué)習(xí)更多的策略模式,可以關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):設(shè)計(jì)模式,可以獲取我整理的設(shè)計(jì)模式教程,都是實(shí)戰(zhàn)干貨。

          本文來(lái)自作者「叁滴水」投稿,謝謝分享,也歡迎愛(ài)好技術(shù)分享的各位技術(shù)朋友向「Java技術(shù)棧」投稿,讓更多人看到,投稿方式:關(guān)注公眾號(hào)「Java技術(shù)棧」在后臺(tái)回復(fù):投稿。






          關(guān)注Java技術(shù)棧看更多干貨



          戳原文,獲取精選面試題!
          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本无套内射 | 一级黄色强奸黑人视频 | 日韩黄色精品 | 国产在线观看黄 | 亚洲中文日韩无码 |