摘要:?jiǎn)栍^察者模式和發(fā)布訂閱模式的有什么區(qū)別答一下,相信都會(huì)有滿屏的結(jié)果告訴你什么是發(fā)布訂閱模式,但還是希望自己通過(guò)一些例子融入去實(shí)現(xiàn)概念理解創(chuàng)建一個(gè)對(duì)象存儲(chǔ)所有訂閱者與其調(diào)用添加訂閱者函數(shù)時(shí)入?yún)⒂?,將其存?chǔ)到調(diào)用發(fā)布訂閱信息函數(shù)時(shí)再根據(jù)入
問(wèn):觀察者模式和發(fā)布訂閱模式的有什么區(qū)別?
答:https://juejin.im/post/5a14e9...
Google一下,相信都會(huì)有滿屏的結(jié)果告訴你什么是發(fā)布訂閱模式,但還是希望自己通過(guò)一些例子融入去實(shí)現(xiàn).
概念理解:
① - 創(chuàng)建一個(gè)對(duì)象subscribers存儲(chǔ)所有訂閱者與其fn.
② - 調(diào)用添加訂閱者函數(shù)時(shí)入?yún)⒂?key,fn),將其存儲(chǔ)到subscribers.
subscribers[key].push(fn);
③ - 調(diào)用發(fā)布訂閱信息函數(shù)時(shí)再根據(jù)入?yún)ey,找到subscribers中對(duì)應(yīng)的訂閱者并調(diào)用該數(shù)組下的所有fn.一、Just Do It
④ - 取消訂閱很簡(jiǎn)單,根據(jù)key在subscribers找到對(duì)應(yīng)的訂閱者刪除即可.
實(shí)現(xiàn)功能:
二、實(shí)現(xiàn)發(fā)布訂閱Class輸入訂閱者名稱點(diǎn)擊添加訂閱者,已訂閱用戶列表添加一名訂閱者,并附帶取消訂閱按鈕
輸入發(fā)布內(nèi)容,點(diǎn)擊發(fā)布給所有訂閱者,用戶列表所有訂閱者接收顯示一條新內(nèi)容
輸入發(fā)布內(nèi)容,點(diǎn)擊發(fā)布給指定訂閱者,指定的訂閱者接收顯示一條新內(nèi)容
點(diǎn)擊取消訂閱,刪除對(duì)應(yīng)訂閱者信息
① - 添加訂閱調(diào)用subscribe,以key為鍵名存儲(chǔ)訂閱者,fn為值存儲(chǔ)回調(diào)函數(shù).
② - 發(fā)布調(diào)用publish根據(jù)key找到對(duì)應(yīng)的訂閱者并調(diào)用其回調(diào)函數(shù).
③ - key等于all則發(fā)布給所有訂閱者
④ - 取消訂閱調(diào)用cancelSubscribe,根據(jù)key刪除對(duì)應(yīng)訂閱者
--- Code Example ---
class SubscribePublish { subs = {}; //存儲(chǔ)訂閱者 // 添加訂閱 subscribe(key, fn) { if (!this.subs[key]) this.subs[key] = []; this.subs[key].push(fn) console.log(key,"-----添加訂閱-----"); } // 發(fā)布訂閱消息 publish(key,params) { // 1.發(fā)布給所有訂閱者 if(key === "all"){ let allKey = Object.keys(this.subs); allKey.forEach(key=>{ this.runCallback(this.subs[key],params); }) return; } // 2.發(fā)布給指定訂閱者 this.runCallback(this.subs[key],params); console.log(key,"-----發(fā)布訂閱消息-----"); } // 執(zhí)行訂閱函數(shù) runCallback(subs,params){ if (!Array.isArray(subs) || subs.length <= 0) return false; let len = subs.length; while (len--) { subs[len].call(this, params); } } // 取消訂閱 cancelSubscribe(key){ if(this.subs[key]){ delete this.subs[key]; } console.log(this.subs,"-----取消訂閱-----"); } }三、功能實(shí)現(xiàn)闡述
// 實(shí)例化發(fā)布訂閱Class const subEvent = new SubscribePublish();
① - 獲取input輸入的訂閱者名稱,創(chuàng)建一個(gè)li+button標(biāo)簽 Dom元素并添加class以訂閱者名稱作為類名. (button=取消訂閱按鈕 & li=已訂閱用戶列表item)
② - 調(diào)用subEvent.subscribe(key,fn)添加訂閱者,入?yún)ey=input輸入的訂閱者名稱 & fn=發(fā)布時(shí)調(diào)用的回調(diào)函數(shù).
③ - 通過(guò)fn回調(diào)獲取到公眾號(hào)發(fā)布的內(nèi)容,創(chuàng)建一個(gè)p標(biāo)簽dom元素顯示發(fā)布內(nèi)容.
① - 發(fā)布訂閱只需要獲取公眾號(hào)發(fā)布的內(nèi)容,點(diǎn)擊時(shí)區(qū)分指定|所有調(diào)用subEvent.publish(key,content),publish會(huì)根據(jù)key值觸發(fā)對(duì)應(yīng)訂閱者的回調(diào)函數(shù).
② - 入?yún)⒄f(shuō)明:
key=all 發(fā)布訂閱信息給所有訂閱者
key=name 發(fā)布給name訂閱者
content 要發(fā)布的內(nèi)容
① - 3.1的時(shí)候,在添加訂閱者時(shí)已經(jīng)創(chuàng)建了一個(gè)button按鈕,那么在創(chuàng)建的時(shí)候就已經(jīng)添加了click事件監(jiān)聽(tīng).
② - 當(dāng)點(diǎn)擊取消訂閱的時(shí)候,調(diào)用subEvent.cancelSubscribe(key)刪除對(duì)應(yīng)訂閱者并根據(jù)訂閱者名稱查找對(duì)應(yīng)class類名的li標(biāo)簽將其Dom節(jié)點(diǎn)刪除.
完整代碼URL:
https://github.com/SmallFish-...
本文完 - 感謝閱讀.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106059.html
摘要:發(fā)布訂閱模式訂閱者把自己想訂閱的事件注冊(cè)到調(diào)度中心,當(dāng)發(fā)布者發(fā)布該事件到調(diào)度中心,也就是該事件觸發(fā)時(shí),由調(diào)度中心統(tǒng)一調(diào)度訂閱者注冊(cè)到調(diào)度中心的處理代碼。 發(fā)布-訂閱模式,看似陌生,其實(shí)不然。工作中經(jīng)常會(huì)用到,例如 Node.js EventEmitter 中的 on 和 emit 方法;Vue 中的 $on 和 $emit 方法。他們都使用了發(fā)布-訂閱模式,讓開(kāi)發(fā)變得更加高效方便。 一...
摘要:是的縮寫(xiě),起源于,是一個(gè)基于可觀測(cè)數(shù)據(jù)流結(jié)合觀察者模式和迭代器模式的一種異步編程的應(yīng)用庫(kù)。是基于觀察者模式和迭代器模式以函數(shù)式編程思維來(lái)實(shí)現(xiàn)的。學(xué)習(xí)之前我們需要先了解觀察者模式和迭代器模式,還要對(duì)流的概念有所認(rèn)識(shí)。 RxJS 是 Reactive Extensions for JavaScript 的縮寫(xiě),起源于 Reactive Extensions,是一個(gè)基于可觀測(cè)數(shù)據(jù)流 Stre...
摘要:觀察者模式定義設(shè)計(jì)模式中對(duì)的定義一個(gè)對(duì)象稱為維持一系列依賴于它觀察者的對(duì)象,將有關(guān)狀態(tài)的任何變更自動(dòng)通知給它們。如圖模式比較觀察者模式則多了一個(gè)類似于話題調(diào)度中心的流程,發(fā)布者和訂閱者解耦。 Obeserver(觀察者)模式 定義 《js設(shè)計(jì)模式》中對(duì)Observer的定義:一個(gè)對(duì)象(稱為subject)維持一系列依賴于它(觀察者)的對(duì)象,將有關(guān)狀態(tài)的任何變更自動(dòng)通知給它們。 《設(shè)計(jì)模...
摘要:它有發(fā)布者,訂閱者這兩個(gè)主要對(duì)象。的最佳實(shí)踐就是通過(guò)反射犧牲了微小的性能,同時(shí)極大的降低了程序的耦合度。官網(wǎng)和應(yīng)用場(chǎng)景框架的主要功能是幫助我們來(lái)降低多個(gè)組件通信之間的耦合度的解耦。 前兩天在公眾號(hào)里發(fā)了一篇有關(guān)EventBus的文章《玩轉(zhuǎn)EventBus,詳解其使用》,有讀者和開(kāi)發(fā)者反饋說(shuō)沒(méi)有OTTO好用。確實(shí)是,各有優(yōu)缺點(diǎn)吧,那今天就有必要再講一下Otto事件框架。 OTTO是Squ...
閱讀 3036·2023-04-25 20:22
閱讀 3350·2019-08-30 11:14
閱讀 2602·2019-08-29 13:03
閱讀 3190·2019-08-26 13:47
閱讀 3235·2019-08-26 10:22
閱讀 1279·2019-08-23 18:26
閱讀 628·2019-08-23 17:16
閱讀 1923·2019-08-23 17:01