上次研究觀察者模式,很多文章說(shuō)它也叫Subscribe/Publish(發(fā)布/訂閱模式)。可在《Javascript設(shè)計(jì)模式》一書(shū)中,這兩種模式還是有些區(qū)別的。書(shū)中原話(huà)如下:
1.Observer模式要求希望接收到主題通知者的觀察者必須訂閱內(nèi)容改變的事件。
2.Subscribe/Publish模式使用了一個(gè)主題/事件通道,這個(gè)通道介于訂閱者和發(fā)布者之間。該事件系統(tǒng)允許代碼定義應(yīng)用程序的特定事件,該事件可以傳遞自定義參數(shù),自定義參數(shù)包含訂閱者所需要的值。其目的是避免訂閱者和發(fā)布者產(chǎn)生依賴(lài)關(guān)系。
與Observer模式不同之處在于它允許任何訂閱者執(zhí)行適當(dāng)?shù)氖录幚沓绦騺?lái)注冊(cè)和接收發(fā)布者發(fā)出的通知。
好吧,不明覺(jué)厲。下面是我的理解:
1.觀察者模式中,目標(biāo)對(duì)象負(fù)責(zé)維護(hù)觀察者。發(fā)布/訂閱模式中發(fā)布者不關(guān)心訂閱者,只負(fù)責(zé)把消息丟出去就不管了。
2.觀察者模式中,觀察者要提供一個(gè)接口,然后當(dāng)目標(biāo)對(duì)象發(fā)生改變時(shí)調(diào)用此接口使自身狀態(tài)和目標(biāo)狀態(tài)保持一致。即所有的觀察者都要有一個(gè)統(tǒng)一的接口(比如上文中寫(xiě)的update方法,大家的方法都要叫這個(gè)名字)。而發(fā)布/訂閱模式中,訂閱者事件的觸發(fā)不是依靠這樣一個(gè)接口,而是訂閱者通過(guò)監(jiān)聽(tīng)一個(gè)特定的消息(這個(gè)消息一般包含名稱(chēng)和訂閱者所需要的參數(shù))來(lái)觸發(fā)的。可以理解為訂閱者監(jiān)聽(tīng)的不是發(fā)布者,而是消息池,只要消息池里有它關(guān)心的消息,即觸發(fā)事件,不管這個(gè)消息是誰(shuí)發(fā)布過(guò)去的。發(fā)布者和訂閱者是解耦的。
下面是js中發(fā)布/訂閱模式的實(shí)現(xiàn),復(fù)制粘貼到console里面試一試就明白了:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注