<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ì)策略模式!

          共 5442字,需瀏覽 11分鐘

           ·

          2021-04-06 20:01


          上一篇:3600萬(wàn)中國(guó)人在抖音“上清華”

          作者:叁滴水
          博客: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ò)展受限。


          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)雅。

          但是,其實(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ú)意是畫蛇添足。
          看完這篇文章,你有什么收獲?歡迎在留言區(qū)與10w+Java開(kāi)發(fā)者一起討論~

          關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的教程,都是干貨。


          猜你喜歡

          1、GitHub 標(biāo)星 3.2w!史上最全技術(shù)人員面試手冊(cè)!FackBoo發(fā)起和總結(jié)

          2、如何才能成為優(yōu)秀的架構(gòu)師?

          3、從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4、程序員一般可以從什么平臺(tái)接私活?

          5、37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...

          6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光

          7、不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          8、15張圖看懂瞎忙和高效的區(qū)別

          9、2T架構(gòu)師學(xué)習(xí)資料干貨分享


          瀏覽 18
          點(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>
                  仓井空一区二区三区 | 午夜寂寞少妇 | 日本少妇 ╳乄 黑人 | 99热网址 | 国产足交在线观看 |