成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript - 發(fā)布-觀察者模式的小案例

xuxueli / 1908人閱讀

摘要:今天我們討論的是發(fā)布觀察者模式,也叫訂閱模式,在里,該模式要如何實(shí)現(xiàn)呢,首先我們先看一個(gè)現(xiàn)實(shí)生活中的例子小明在工作幾年后,準(zhǔn)備買房結(jié)婚,于是他到售樓處,找售樓人員詢問當(dāng)前的價(jià)格,得知售樓價(jià)每平是小明好幾個(gè)月工資的時(shí)候,小明猶豫了,于是他回

今天我們討論的是發(fā)布-觀察者模式,也叫訂閱模式,在javascript里,該模式要如何實(shí)現(xiàn)呢,首先我們先看一個(gè)現(xiàn)實(shí)生活中的例子

小明在工作幾年后,準(zhǔn)備買房結(jié)婚,于是他到售樓處,找售樓人員詢問當(dāng)前的價(jià)格,得知售樓價(jià)每平是小明好幾個(gè)月工資的時(shí)候,小明猶豫了,于是他回去后,每天都給售樓處打電話,詢問售樓人員的價(jià)格,售樓人員也會(huì)耐心解答,但是第二天又來了一個(gè)小芳,于是小芳每天也在打電話,時(shí)間久了,人越來越多,售樓人員每天接這么多電話,肯定吃不消要跳槽,當(dāng)然我們只是舉例子,現(xiàn)實(shí)情況是,售樓人員會(huì)留下小明,小芳等等人的電話存在花名冊(cè)里,這就是訂閱,然后等房?jī)r(jià)降下來的時(shí)候,售樓人員一個(gè)個(gè)打電話通知他們,這樣雙方都省了力氣,訂閱消息的人也拿到了應(yīng)得的消息?,F(xiàn)在假設(shè)花名冊(cè)是 clientList , 售樓處是salePart,以此我們寫一個(gè)簡(jiǎn)單發(fā)布-觀察者模式的代碼

var salePart = {}  // 售樓處
  var clientList = []  // 花名冊(cè)

  var xiaoming = {
    name: "小明",
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(","))
    }
  }

  salePart.listen = function (person) {  // 售樓處登記來訪者的信息
    clientList.push(person)
  }

  salePart.trigger = function (type, price) {  // 售樓處通知來訪者信息,type為售房面積,price為售房?jī)r(jià)格
    if (clientList.length > 0) {
      for (var i = 0, person; person = clientList[i++];) {
        if (typeof person.fn === "function") {
          person.fn(type, price)
        }
      }
    }
  }

  salePart.listen(xiaoming)
  salePart.trigger("square80", 60000)  // 打印出來  小明,square80,60000

下面小芳也要來看房,可是小芳比小明有錢的多,她要看的是200平米的房子,這樣把小芳在添加進(jìn)去的時(shí)候,售樓處就不能按照分類來進(jìn)行通知他們的,200平米的房子的通知小明也能看到,這樣小明會(huì)更扎心,萬一不開心,就會(huì)損失一個(gè)潛在客戶,所以我們還要完善一下上述代碼,讓售樓處可以按照房屋面積分別通知對(duì)應(yīng)的買房者

 var salePart = {}  // 售樓處
  var clientList = {}  // 花名冊(cè)

  var xiaoming = {
    name: "小明",
    type: "s80",
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(","))
    }
  }

  var xiaofang = {
    name: "小芳",
    type: "s200",
    fn: function () {
      var args = [].slice.call(arguments)
      args.unshift(this.name)
      console.log(args.join(","))
    }
  }

  salePart.listen = function (person) {  // 售樓處登記來訪者的信息
    var type = person.type
    if (!clientList[type] || clientList[type].length < 0) {  // 原來的花名冊(cè)先分類,然后再存入每個(gè)人的信息
      clientList[type] = []
    }
    clientList[type].push(person)
  }

  salePart.trigger = function (type, price) {  // 售樓處通知來訪者信息,type為售房類型,price為售房?jī)r(jià)格
    if (clientList[type] && clientList[type].length > 0) {
      for (var i = 0, person; person = clientList[type][i++];) {
        if (typeof person.fn === "function") {
          person.fn(type, price)
        }
      }
    }
  }

  salePart.listen(xiaoming)
  salePart.listen(xiaofang)

  salePart.trigger("s80", 60000)  // 打印出來  小明,square80,60000
  salePart.trigger("s200", 200000)  // 打印出來  小芳,square200,200000

可以看到,小明只能接收到80平米的房?jī)r(jià)信息,小芳呢,也只能看到200平米的房?jī)r(jià)信息,這樣售樓處又回到了一片欣欣向榮的社會(huì)主義和諧景象,但是在實(shí)際開發(fā)中,上面的代碼并不利于維護(hù),因?yàn)楹芩缮?,我們可以用?duì)象的方式來把代碼重構(gòu)一下

var SalePart = function () {
    this.clientList = {}
  }

  SalePart.prototype.listen = function () {  // 現(xiàn)在我們把該函數(shù)處理為可以一次接收多個(gè)來訪者
    var persons = [].slice.call(arguments)

    for (var i = 0, p; p = persons[i++];) {
      var type = p.type
      if (!this.clientList[type] || this.clientList[type].length < 0) {
        this.clientList[type] = []
      }
      this.clientList[type].push(p)
    }
  }

  SalePart.prototype.trigger = function (type, price) {
    if (this.clientList[type] && this.clientList[type].length > 0) {
      for (var i = 0, p; p = this.clientList[type][i++];) {
        if (typeof p.fn === "function") {
          p.fn(type, price)
        }
      }
    }
  }

  var salePart = new SalePart()
  salePart.listen(xiaoming, xiaofang)
  salePart.trigger("s80", 50000)  // 小明,s80,50000 感謝黨和國(guó)家房?jī)r(jià)終于降了!
  salePart.trigger("s200", 100000)  // 小芳,s200,100000  這么便宜,買買買?。?!

以上就是本章的內(nèi)容,結(jié)合實(shí)際案例希望大家看起來更好理解一些,如有疑問,可以在下方留言,看到后我會(huì)盡快回復(fù)。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93586.html

相關(guān)文章

  • 察者模式的使用介紹

    摘要:觀察者模式介紹觀察者模式又稱發(fā)布訂閱模式,它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變的時(shí)候,所依賴它的對(duì)象都能得到通知。關(guān)于內(nèi)部的觀察者模式可以參數(shù)這篇文檔??偨Y(jié)總之,觀察者模式在中的使用是非常廣泛的。 javascript觀察者模式 介紹 觀察者模式又稱發(fā)布-訂閱模式,它定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變的時(shí)候,所依賴它的對(duì)象都能得到通知。例如:我們訂閱...

    ityouknow 評(píng)論0 收藏0
  • 前端知識(shí)點(diǎn)

    摘要:原理對(duì)處理函數(shù)進(jìn)行延時(shí)操作,若設(shè)定的延時(shí)到來之前,再次觸發(fā)事件,則清除上一次的延時(shí)操作定時(shí)器,重新定時(shí)。在目標(biāo)發(fā)出內(nèi)容改變的事件后,直接接收事件并作出響應(yīng)。首先是目標(biāo)的構(gòu)造函數(shù),他有個(gè)數(shù)組,用于添加觀察者。 關(guān)于排序 js中sort函數(shù)的底層實(shí)現(xiàn)機(jī)制? js中sort內(nèi)置多種排序算法,是根據(jù)要排序數(shù)的亂序程度來決定使用哪一種排序方法。V8 引擎 sort 函數(shù)只給出了兩種排序 Inse...

    wums 評(píng)論0 收藏0
  • JavaScript 模式》知識(shí)點(diǎn)小抄本(下)

    摘要:缺點(diǎn)不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。預(yù)防低水平人員帶來的風(fēng)險(xiǎn)。開閉原則,高拓展性。這里的訂閱者稱為觀察者,而被觀察者稱為發(fā)布者,當(dāng)一個(gè)事件發(fā)生,發(fā)布者會(huì)發(fā)布通知所有訂閱者,并常常以事件對(duì)象形式傳遞消息。 介紹 最近開始給自己每周訂個(gè)學(xué)習(xí)任務(wù),學(xué)習(xí)結(jié)果反饋為一篇文章的輸出,做好學(xué)習(xí)記錄。 這一周(02.25-03.03)我定的目標(biāo)是《JavaScript 模式》...

    xiguadada 評(píng)論0 收藏0
  • JavaScript 中常見設(shè)計(jì)模式整理

    摘要:開發(fā)中,我們或多或少地接觸了設(shè)計(jì)模式,但是很多時(shí)候不知道自己使用了哪種設(shè)計(jì)模式或者說該使用何種設(shè)計(jì)模式。本文意在梳理常見設(shè)計(jì)模式的特點(diǎn),從而對(duì)它們有比較清晰的認(rèn)知。 showImg(https://segmentfault.com/img/remote/1460000014919705?w=640&h=280); 開發(fā)中,我們或多或少地接觸了設(shè)計(jì)模式,但是很多時(shí)候不知道自己使用了哪種設(shè)...

    Nosee 評(píng)論0 收藏0
  • javascript設(shè)計(jì)模式學(xué)習(xí)筆記之發(fā)布-訂閱模式

    摘要:發(fā)布訂閱模式定義對(duì)象間的一種一對(duì)多的依賴關(guān)系當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)所有依賴于它的對(duì)象都將得到通知簡(jiǎn)單實(shí)現(xiàn)定義發(fā)布者緩存列表存放訂閱者的回調(diào)函數(shù)定義訂閱者發(fā)布消息測(cè)試訂閱者價(jià)格訂閱者價(jià)格發(fā)布消息上面的實(shí)現(xiàn)方式導(dǎo)致了每個(gè)訂閱者都會(huì)收到發(fā)布 發(fā)布-訂閱模式 定義對(duì)象間的一種 一對(duì)多 的依賴關(guān)系, 當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí), 所有依賴于它的對(duì)象都將得到通知 簡(jiǎn)單實(shí)現(xiàn) // 定...

    klivitamJ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

xuxueli

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<