重學(xué)JS(九)—— 觀察者模式和發(fā)布/訂閱模式真不一樣

有這么一段代碼經(jīng)常會(huì)出現(xiàn)在代碼中

var pubsub = (()=>{
  var topics = {};
  function subscribe(topic,fn){
    if(!topics[topic]){
      topics[topic] = [];  
    }
    topics[topic].push(fn);
  }
  function publish(topic,...args){
    if(!topics[topic])
      return;
    for(let fn of topics[topic]){
      fn(...args);  
    }
  }
 return {
      subscribe,
      publish
  }
})()

測(cè)試代碼

pubsub.subscribe('test',function(a,b){  //訂閱者A訂閱了test事件
  console.log(a,b);    
});
pubsub.publish('test','123','HH');   //123  HH(發(fā)布者B發(fā)布了test事件)

調(diào)用publish后打印出了123 HH济欢。很奇妙的一段代碼,當(dāng)然實(shí)際上只是遍歷了數(shù)組跌前,然后把數(shù)組中的所有函數(shù)全部執(zhí)行一遍而已雀瓢。但是對(duì)于一個(gè)沒(méi)讀過(guò)實(shí)現(xiàn)代碼的人來(lái)說(shuō),卻是一個(gè)神奇的存在种玛,JS居然能訂閱發(fā)布消息藐鹤,太酷了瓤檐。
有的時(shí)候我會(huì)叫他觀察者模式赂韵,有時(shí)候又會(huì)叫他發(fā)布訂閱模式,覺(jué)得叫什么都是對(duì)的挠蛉。
但是祭示,他們并不一樣。

差異

在觀察者模式中谴古,觀察者需要直接訂閱目標(biāo)事件质涛。在目標(biāo)發(fā)出內(nèi)容改變的事件后,直接接收事件并作出響應(yīng)掰担。發(fā)布訂閱模式相比觀察者模式多了個(gè)事件通道汇陆,訂閱者和發(fā)布者不是直接關(guān)聯(lián)的。
這段話可以看出上面的例子是發(fā)布訂閱模式带饱。訂閱者A和發(fā)布者B是通過(guò)pubsub這個(gè)對(duì)象關(guān)聯(lián)起來(lái)的毡代,他們沒(méi)有直接的交流。

那么真正的觀察者模式是怎么樣的勺疼?

一個(gè)或多個(gè)觀察者對(duì)目標(biāo)的狀態(tài)感興趣教寂,通過(guò)將自己依附在目標(biāo)對(duì)象上以便注冊(cè)所感興趣的內(nèi)容。目標(biāo)狀態(tài)發(fā)生改變并且觀察者可能對(duì)這些改變感興趣执庐,會(huì)發(fā)送一個(gè)通知消息酪耕,調(diào)用每個(gè)觀察者的更新方法。當(dāng)觀察者不再對(duì)目標(biāo)狀態(tài)感興趣時(shí)轨淌,他們可以簡(jiǎn)單將自己從中分離迂烁。

我們來(lái)實(shí)現(xiàn)下觀察者模式看尼。首先是目標(biāo)的構(gòu)造函數(shù),他有個(gè)數(shù)組盟步,用于添加觀察者狡忙。還有個(gè)廣播方法,遍歷觀察者數(shù)組后調(diào)用他們的update方法:

class Subject{
  constructor(){
    this.subs = [];
  }
  addSub(sub){
    this.subs.push(sub);
  }
  notify(){
    this.subs.forEach(sub=> {
      sub.update();
    });
  }
}

那么觀察者就得有個(gè)update方法:

class Observer{
  update(){
    console.log('update');
  }
}

測(cè)試代碼

let subject = new Subject();
let ob = new Observer();
//目標(biāo)添加觀察者了
subject.addSub(ob);
//目標(biāo)發(fā)布消息調(diào)用觀察者的更新方法了
subject.notify();   //update

可以看到目標(biāo)和觀察者是直接聯(lián)系在一起的址芯。觀察者把自身添加到了目標(biāo)對(duì)象中灾茁,可見(jiàn)和發(fā)布訂閱模式差別還是很大的。在這種模式下谷炸,目標(biāo)更像一個(gè)發(fā)布者北专,他讓添加進(jìn)來(lái)的所有觀察者都執(zhí)行了update函數(shù),而觀察者就像一個(gè)訂閱者旬陡。

優(yōu)劣

個(gè)人覺(jué)得發(fā)布/訂閱模式比較簡(jiǎn)單拓颓,使用的也比較廣泛。由于他訂閱者和發(fā)布者不直接關(guān)聯(lián)的特點(diǎn)我們完全可以把管理事件的對(duì)象寫到一個(gè)單獨(dú)文件中描孟,作為庫(kù)來(lái)使用驶睦。發(fā)布訂閱模式中,雙方不知道對(duì)方的存在匿醒,而觀察者模式中场航,目標(biāo)和觀察者是直接聯(lián)系起來(lái)的。具體選擇什么模式廉羔,得視場(chǎng)景而定溉痢。一般來(lái)說(shuō),發(fā)布/訂閱就夠用了憋他,簡(jiǎn)單清晰孩饼,符合我們dom事件編程的觀念。
觀察者模式哪里被用到過(guò)竹挡?vue的雙向綁定镀娶。下篇就講一下觀察者模式在vue雙向綁定實(shí)現(xiàn)中的運(yùn)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揪罕,一起剝皮案震驚了整個(gè)濱河市梯码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耸序,老刑警劉巖忍些,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坎怪,居然都是意外死亡罢坝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘁酿,“玉大人隙券,你說(shuō)我怎么就攤上這事∧炙荆” “怎么了娱仔?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)游桩。 經(jīng)常有香客問(wèn)我牲迫,道長(zhǎng),這世上最難降的妖魔是什么借卧? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任盹憎,我火速辦了婚禮,結(jié)果婚禮上铐刘,老公的妹妹穿的比我還像新娘陪每。我一直安慰自己,他們只是感情好镰吵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布檩禾。 她就那樣靜靜地躺著,像睡著了一般疤祭。 火紅的嫁衣襯著肌膚如雪盼产。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天画株,我揣著相機(jī)與錄音辆飘,去河邊找鬼啦辐。 笑死谓传,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芹关。 我是一名探鬼主播续挟,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侥衬!你這毒婦竟也來(lái)了诗祸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轴总,失蹤者是張志新(化名)和其女友劉穎直颅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀樟,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡功偿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了往堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片械荷。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡共耍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吨瞎,到底是詐尸還是另有隱情痹兜,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布颤诀,位于F島的核電站字旭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏崖叫。R本人自食惡果不足惜谐算,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一边篮、第九天 我趴在偏房一處隱蔽的房頂上張望灌曙。 院中可真熱鬧,春花似錦励饵、人聲如沸剧包。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆液。三九已至一铅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕油,已是汗流浹背潘飘。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掉缺,地道東北人卜录。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像眶明,于是被迫代替她去往敵國(guó)和親艰毒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 訂閱報(bào)紙的過(guò)程## 來(lái)考慮實(shí)際生活中訂閱報(bào)紙的過(guò)程搜囱,這里簡(jiǎn)單總結(jié)了一下丑瞧,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,625評(píng)論 5 57
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情蜀肘,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式绊汹。簡(jiǎn)單...
    舟漁行舟閱讀 7,771評(píng)論 2 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評(píng)論 25 707
  • 靜靜的愛(ài)著這么一個(gè)人 從開始到時(shí)光的盡頭 并不想遇見(jiàn)最好的你 而渴望相逢在故事的最初 那時(shí)風(fēng)剛剛開始變暖 那時(shí)的我...
    臥龍飲水閱讀 343評(píng)論 0 2
  • 推送技術(shù)產(chǎn)生場(chǎng)景: --服務(wù)器端主動(dòng)性: 客戶端與服務(wù)器交互都是客戶端主動(dòng)的, 服務(wù)器一般不能主動(dòng)與客戶端進(jìn)行數(shù)據(jù)...
    原軍鋒閱讀 34,647評(píng)論 4 60