国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript常用的設(shè)計(jì)模式

mengbo / 3498人閱讀

摘要:前言設(shè)計(jì)模式幾十種,閱讀了設(shè)計(jì)模式與開發(fā)實(shí)踐這本書后,個人感覺就是圍繞對象來設(shè)計(jì)的,發(fā)現(xiàn)日常寫代碼能用上的并不多,下面是常用的幾種設(shè)計(jì)模式。前端服務(wù)端可以參考我的另一個倉庫地址,一個簡單的實(shí)時聊天參考來自設(shè)計(jì)模式與開發(fā)實(shí)踐讀書筆記

前言

設(shè)計(jì)模式幾十種,閱讀了《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》這本書后,個人感覺js就是圍繞對象來設(shè)計(jì)的,發(fā)現(xiàn)日常寫代碼能用上的并不多,下面是常用的幾種設(shè)計(jì)模式。

我的github,歡迎 star

模式列表

單例模式

策略模式

模板方法模式

職責(zé)鏈模式

發(fā)布訂閱模式

設(shè)計(jì)模式 單例模式

單一模式的核心是確保只有一個實(shí)例,并提供全局訪問,在 JS 開發(fā)中,經(jīng)常把用一個對象包裹,這樣減少了全局變量的污染,比如 var a = {}。

普通寫法:

  // 每次點(diǎn)擊點(diǎn)擊按鈕,都會創(chuàng)建一個 div
  var createLayer1 = (function () {
    var div = document.createElement("div");
      div.innerHTML = "我是內(nèi)容";
      div.style.display = "none";
      document.body.appendChild(div);
      return div;
  })()

  document.getElementById("#btn").onclick = function () {
    var layer1 = createLayer1();
    layer1.style.display = "block";
  }

單例模式:

  //實(shí)例對象總是在我們調(diào)用方法時才被創(chuàng)建,而不是在頁面加載好的時候就創(chuàng)建。  
  // 這樣就不會每次點(diǎn)擊按鈕,都會創(chuàng)建一個 div 了
  var createLayer2 = function () {
    var div;
    return function () {
      if (!div) {
        document.createElement("div");
        div.innerHTML = "我是內(nèi)容";
        div.style.display = "none";
        document.body.appendChild(div);
      }
      return div;
    }
  }

  document.getElementById("#btn").onclick = function () {
    var layer2 = createLayer2();
    layer2.style.display = "block";
  }
策略模式

策略模式代碼非常優(yōu)雅,最喜歡模式之一,也很便于修改,請看代碼。

普通模式:

  var awardS = function (salary) {
    return salary * 4
  };

  var awardA = function (salary) {
    return salary * 3
  };

  var awardB = function (salary) {
    return salary * 2
  };

  var calculateBonus = function (level, salary) {
    if (level === "S") {
      return awardS(salary);
    }
    if (level === "A") {
      return awardA(salary);
    }
    if (level === "B") {
      return awardB(salary);
    }
  };

  calculateBonus("A", 10000);

策略模式:

  var strategies = {
    "S": function (salary) {
      return salary * 4;
    },
    "A": function (salary) {
      return salary * 3;
    },
    "B": function (salary) {
      return salary * 2;
    }
  }

  var calculateBonus = function (level, salary) {
    return strategies[level](salary);
  }

  calculateBonus("A", 10000);
模板方法模式

模板方法模式使用了原型鏈的方法,封裝性好,復(fù)用性差。

  var Coffee = function () {

  };
  Coffee.prototype.boilWater = function () {
    // todo
    console.log("把水煮沸");
  };
  Coffee.prototype.brewCoffee = function () {
    // todo
    console.log("沖咖啡");
  };
  Coffee.prototype.pourInCup = function () {
    // todo
    console.log("把咖啡倒進(jìn)杯子");
  };
  Coffee.prototype.addSugarAndMilk = function () {
    // todo
    console.log("加糖和牛奶");
  };
  Coffee.prototype.init = function () {
    this.boilWater();
    this.brewCoffee();
    this.pourInCup();
    this.addSugarAndMilk();
  }

  var coffee = new Coffee();
  coffee.init();
職責(zé)鏈模式

沒錯,我剛開始寫第一個項(xiàng)目時候就這么嵌套的,重復(fù)代碼太多,邏輯太亂,維護(hù)下太差。

  var order = function (orderType, pay, stock) {
    // 500 元定金模式
    if (orderType === 1) {
      if (pay === true) {
        console.log("500元定金預(yù)購,得到100元優(yōu)惠券");
      } else {
        if (stock > 0) {
          console.log("普通購買,無優(yōu)惠券");
        } else {
          console.log("手機(jī)庫存不足");
        }
      }
    // 200 元定金模式
    } else if (orderType === 2) {
      if (pay === true) {
        console.log("200元定金預(yù)購,得到50元優(yōu)惠券");
      } else {
        if (stock > 0) {
          console.log("普通購買,無優(yōu)惠券");
        } else {
          console.log("手機(jī)庫存不足");
        }
      }
    // 沒有定金模式  
    } else if (orderType === 3) {
      if (stock > 0) {
        console.log("普通購買,無優(yōu)惠券");
      } else {
        console.log("手機(jī)庫存不足");
      }
    } 
  }

  order(1, true, 500);

職責(zé)鏈,一系列可能處理請求的對象被連接成一條鏈,請求在這些對象之間依次傳遞,直到遇到一個可以處理它的對象,減少了很多重復(fù)代碼。

  var order500 = function (orderType, pay, stock) {
    if (orderType === 1 && pay === true) {
      console.log("500元定金預(yù)購,得到100元優(yōu)惠券");
    } else {
      order200(orderType, pay, stock);
    }
  }

  var order200 = function (orderType, pay, stock) {
    if (orderType === 2 && pay === true) {
      console.log("200元定金預(yù)購,得到50元優(yōu)惠券");
    } else {
      orderNormal(orderType, pay, stock);
    }
  }

  var orderNormal = function (orderType, pay, stock) {
    if (stock > 0) {
      console.log("普通購買,無優(yōu)惠券");
    } else {
      console.log("手機(jī)庫存不足");
    }
  }

  order500(1, true, 500);
  order500(1, false, 500);
  order500(2, true, 500);
發(fā)布-訂閱模式

發(fā)布訂閱模式,顧名思義,就是一個發(fā)布消息,一個監(jiān)聽消息,當(dāng)有消息接收時處理消息。

// js前端
  window.onload = function () {
    var socket = io.connect("http://localhost:20122?token=abc");
    socket.on("connect", function() {
      socket.emit("message", ":chat socket")
    });
    socket.on("message", function(data) {
      alert(data)
    })
  };

  // 服務(wù)端
  io.on("connection", function (socket) {
    socket.on("chat message", function (msg) {
      console.log("receive a message: " + msg)
      io.emit("chat message", msg);
    });
  })

可以參考我的另一個倉庫地址,一個簡單的實(shí)時聊天 demo

參考

來自《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》讀書筆記

https://github.com/hankzhuo/s...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89289.html

相關(guān)文章

  • +【13】JavaScript設(shè)計(jì)原則&&常用設(shè)計(jì)模式

    摘要:打個比方源碼使用了模式,解決了問題,但是,在選擇模式解決問題的背后又有多少思考 showImg(https://segmentfault.com/img/bVbupTE?w=480&h=260); 【前言】 最近閱讀了《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》,收獲頗豐,于是想寫一點(diǎn)總結(jié)及感想 showImg(https://segmentfault.com/img/bVbupUE?w...

    opengps 評論0 收藏0
  • JavaScript常用設(shè)計(jì)模式

    摘要:原文鏈接常用設(shè)計(jì)模式設(shè)計(jì)模式設(shè)計(jì)模式是一種在長時間的經(jīng)驗(yàn)與錯誤中總結(jié)出來可服用的解決方案。用來模擬接口的相關(guān)操作我很帥通過適配器函數(shù)來調(diào)用目的我很帥學(xué)習(xí)資料聽飛狐聊設(shè)計(jì)模式系列設(shè)計(jì)模式湯姆大叔 原文鏈接: JavaScript常用設(shè)計(jì)模式 設(shè)計(jì)模式 設(shè)計(jì)模式是一種在長時間的經(jīng)驗(yàn)與錯誤中總結(jié)出來可服用的解決方案。 設(shè)計(jì)模式主要分為3類: 創(chuàng)建型設(shè)計(jì)模式:專注于處理對象的創(chuàng)建 Const...

    RyanHoo 評論0 收藏0
  • 學(xué)Java編程需要注意地方

    摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會編程,在學(xué)習(xí)和解決問題上總會碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。   學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學(xué)習(xí)和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進(jìn)步的機(jī)會,因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...

    leanxi 評論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0
  • 個人分享--web前端學(xué)習(xí)資源分享

    摘要:前言月份開始出沒社區(qū),現(xiàn)在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議那么今天我就把看過的一些學(xué)習(xí)資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區(qū),現(xiàn)在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準(zhǔn)備轉(zhuǎn)正了!一般來說,差不多到了轉(zhuǎn)正的時候,會進(jìn)行總結(jié)或者分享會議!那么今天我就...

    sherlock221 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<