摘要:期設計模式如何理解觀察者發布訂閱模式定義觀察者模式又叫發布訂閱模式,它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生變化時就會通知所有的觀察者對象,使得它們能夠自動更新自己生活實例理解你今天去看一個
20190411期
設計模式-如何理解觀察者(發布訂閱)模式?
定義: 觀察者模式又叫發布訂閱模式(Publish/Subscribe),它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生變化時就會通知所有的觀察者對象,使得它們能夠自動更新自己
生活實例理解:你今天去看一個樓盤,去了之后發布樓盤還沒有對外銷售,你不知道樓盤時候會對外銷售,于是你找了樓盤的負責人,告訴他什么時候樓盤開始銷售了電話通知你,然后想要買的人不是你一個,其它人也是通過留電話的方式給銷售負責人來及時獲取消息
不難發現,上面的例子正好對應上我們的觀察者模式的定義, 多個想要買房的人同時訂閱了一個主題(樓盤對外銷售),這個主題更新時,這些觀察者(買房)都會作出相應的動作
最熟悉的代碼理解:
實際上,我們經常用到的事件綁定就是發布訂閱模式
在這里我們想在用戶點擊的時候做出相應的處理,但是我們不知道用戶在什么時候去點擊,所以我們去訂閱body上的click事件,在這里我們還可以去隨意增加訂閱者,這樣并不影響我們的發布者
document.body.addEventListener("click",function(){ console.log("JS 每日一題") },false) document.body.addEventListener("click",function(){ console.log("今天你打卡了嗎?") },false)
首先我們順一下思路
誰是發布者
誰是訂閱者
發生改變時怎么通知訂閱者作出相應動作
const Boss = {} //樓盤銷售負責人 Boss.clientList = []; // 存放訂閱者的回調 Boss.listen = function(fn){ // 增加訂閱者 this.clientList.push(fn); // 將買房人的號碼緩存起來 } Boss.trigger = function(){ // 發布消息 for(var i=0,fn; fn= this.clientList[i++];){ fn.apply(this,arguments) } } Boss.listen(function(msg){ console.log(msg) // 開始銷售了 }) cdBoss.trigger("開始銷售了") // 發布消息
我們已經實現在最簡易版的發布訂閱,但其實是存在問題的,每個人可能訂閱戶型是不同的, 上面我們實現的是,只要一開始銷售就通知所有訂閱的人,顯然是不合理的,我們將代碼再來改寫一下
// 訂閱時給其加一個key做為標識,就相當于key就是訂閱者的身份 Boss.listen = function(key, fn){ if (!this.clientList[key]) { // 如果沒有此類訂閱,就給該類訂閱增加一個緩存列表 this.clientList[key] = [] } this.clientList[key].push(fn); } Boss.trigger = function(){ // 發布消息 const key = Array.prototype.shift.call(arguments), // 取出消息類型 fns = this.clientList[key] if (!fns || !fns.length) return // 如果該類消息沒有訂閱直接返回 for (var i = 0, fn; fn = fns[i++]) { fn.apply(this, arguments) } } Boss.listen("老王", function (msg) { console.log("老王訂閱戶型" + cdName) }) Boss.listen("老李", function (cdName) { console.log("老李訂閱戶型" + cdName) }) Boss.trigger("老王", "143平米"); Boss.trigger("老李", "888平米");
好了,經過改寫,消息只會推送給相關的訂閱者了
總結時間上的解藕
對象之間的解藕
總的來說,觀察者模式所做的工作就是在解耦,讓耦合的雙方都依賴于抽象,而不是依賴于具體。從而使得各自的變化都不會影響到另一邊的變化
關于JS每日一題JS每日一題可以看成是一個語音答題社區
每天利用碎片時間采用60秒內的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案
注 絕不僅限于完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路
點擊加入答題
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/103455.html
摘要:下面筆者就結合諸如的的里面的里面的來給大家簡單介紹下設計模式在這些庫語法和框架中的使用。筆者認為把設計模式單獨抽象出來探討,就和算法中抽象出來冒泡排序一樣,是為了描述一種常用的。 本文為饑人谷講師slashhuang原創文章。 在編寫JS代碼的過程中,運用一定的設計模式可以讓我們的代碼更加優雅、靈活。 下面筆者就結合諸如redux的subscribe、ES6的class、vue里面的$...
摘要:下面筆者就結合諸如的的里面的里面的來給大家簡單介紹下設計模式在這些庫語法和框架中的使用。筆者認為把設計模式單獨抽象出來探討,就和算法中抽象出來冒泡排序一樣,是為了描述一種常用的。 本文為饑人谷講師slashhuang原創文章 在編寫JS代碼的過程中,運用一定的設計模式可以讓我們的代碼更加優雅、靈活。 下面筆者就結合諸如redux的subscribe、ES6的class、vue里面的$d...
摘要:期函數式編程中代碼組合如何理解定義顧名思義,在函數式編程中,就是將幾個有特點的函數拼湊在一起,讓它們結合,產生一個嶄新的函數代碼理解一個將小寫轉大寫的函數一個在字符后加的函數將兩個函數組合起來這里假設我們實現了每日一題每日一題顯示結果里上面 20190315期 函數式編程中代碼組合(compose)如何理解? 定義: 顧名思義,在函數式編程中,Compose就是將幾個有特點的函數拼湊在...
摘要:小程序頁面之間如何通信首先將通信的模型列舉出來分為以下幾種兄弟頁面間通信父路徑頁面向子路徑頁面通信子路徑頁面向父路徑頁面通信通信的方式本地存儲全局對象發布訂閱緩存整個至利用激活方法,通過傳遞數據清空上次通信數據同一樣,利用激活方法,通過讀寫 20190227 小程序頁面之間如何通信? 首先將通信的模型列舉出來, 分為以下幾種 兄弟頁面間通信 父路徑頁面向子路徑頁面通信 子路徑頁面向父...
摘要:期設計模式如何理解工廠模式定義創建對象的接口,讓子類決定實例化哪個類。適用場景需要根據不同參數產生不同實例,這些實例都有相同的行為這時候我們可以使用工廠模式,簡化實現的過程,同時也可以減少每種對象所需的代碼量。 20190408期 設計模式-如何理解工廠模式? 定義: 創建對象的接口,讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類,而子類可以重寫接口方法以便創建的時候指定自己的...
閱讀 3058·2021-10-12 10:12
閱讀 5385·2021-09-26 10:20
閱讀 1526·2021-07-26 23:38
閱讀 2815·2019-08-30 15:54
閱讀 1647·2019-08-30 13:45
閱讀 1966·2019-08-30 11:23
閱讀 3087·2019-08-29 13:49
閱讀 832·2019-08-26 18:23