国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript實現與使用發布/訂閱模式詳解

2024-05-06 15:43:05
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript實現與使用發布/訂閱模式。分享給大家供大家參考,具體如下:

一、發布/訂閱模式簡介

發布/訂閱模式(即觀察者模式): 設計該模式背后的主要動力是促進形成松散耦合。在這種模式中,并不是一個對象調用另一個對象的方法,而是一個訂閱者對象訂閱發布者對象的特定活動,并在發布者對象的狀態發生改變后,訂閱者對象獲得通知。訂閱者也稱為觀察者,而被觀察的對象稱為發布者或主題。當發生了一個重要的事件時,發布者將會通知(調用)所有訂閱者,并且可能經常以事件對象的形式傳遞消息。

基本思路:發布者對象需要一個數組類型的屬性,以存儲所有的訂閱者。訂閱(即注冊)就是將新的訂閱者加入到這個數組中去,而注銷即是從這個數組中刪除某個訂閱者。此外,發布消息就是循環遍歷訂閱者列表并通知他們。

二、如何發布訂閱者的方法?

這里我的大體思路是對的。不過當時面試時,我還說了“在發布者之外,還需要定義了一個新的類——訂閱者。在訂閱者中,需要定義了一個類似 getNews 的方法,以便在發布者發布消息時,調用該方法”。然后,面試官說這樣太麻煩了,萬一訂閱者沒有這個方法呢?然后,我不是很懂……

于是我就想到了,在發布消息時直接傳遞了參數:obj.news = msg; 然后面試官說這樣不是更麻煩了嗎?這樣的話,如果訂閱者沒有 news 這個屬性怎么辦?還得判斷訂閱者是否有 news 這個屬性,沒有的話就會出現 undifined 的報錯。

然后,我就不知道該怎么做了……然后面試官為人特別 nice ,告訴我“可以用繼承或者是在注冊時候就傳入一個 function ”。

面試完后,回家上網查相關知識,整理出的注意點如下:

    發送消息,即通知,意味著調用訂閱者對象的某個方法。故當用戶訂閱信息時,該訂閱者需要向發布者的 subscribe() 提供它的其中一個方法——這應該就是面試官所說的注冊時候就傳入一個方法。 每個發布者對象需要具有以下成員:

subscribers:一個數組,存儲訂閱者;
subscribe():注冊/訂閱,將訂閱者添加到 subscribers 數組中;
unsubscribe():取消訂閱。從 subscribers 數組中刪除訂閱者;
publish():循環遍歷 subscribers 數組中的每一個元素,并且調用它們注冊時所提供的方法;
所有這三種方法都需要一個 type 參數。這是因為發布者可能觸發多個事件(比如同時發布一本雜志和一份報紙),而訂閱者可能僅選擇訂閱其中一種,而另外一種不訂閱。

三、代碼實現

參考《 JavaScript 模式》一書,使用字面量實現代碼如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 汶上县| 阿鲁科尔沁旗| 铁力市| 博罗县| 商水县| 文安县| 珠海市| 务川| 武邑县| 临城县| 日土县| 松江区| 珲春市| 得荣县| 驻马店市| 嘉鱼县| 肇东市| 林西县| 饶阳县| 开封市| 侯马市| 额敏县| 当阳市| 泸州市| 嘉兴市| 夹江县| 阿坝| 绥滨县| 开平市| 渭源县| 六安市| 遂平县| 大连市| 巢湖市| 关岭| 遂平县| 革吉县| 稷山县| 三亚市| 新巴尔虎右旗| 麻栗坡县|