JS設(shè)計(jì)模式七:發(fā)布-訂閱模式

發(fā)布-訂閱模式簡述

發(fā)布---訂閱模式又叫觀察者模式,它定義了對象間的一種一對多的關(guān)系损搬,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象,當(dāng)一個(gè)對象發(fā)生改變時(shí)窄锅,所有依賴于它的對象都將得到通知啤覆。

以網(wǎng)購為例:

假設(shè)小紅看上了一雙鞋子铸磅,但該鞋子已經(jīng)斷貨了刁赦,賣家承諾她到貨通知隔缀。與此同時(shí)幔妨,小明鹦赎、小花燈也關(guān)注了這雙鞋子。

在這個(gè)場景中误堡,賣家就是發(fā)布者古话,小紅等人都屬于訂閱者。當(dāng)鞋子到貨時(shí)锁施,會依次通知到每個(gè)人陪踩。

發(fā)布訂閱模式的優(yōu)點(diǎn):

  1. 支持簡單的廣播通信,當(dāng)對象狀態(tài)發(fā)生改變時(shí)悉抵,會自動通知已經(jīng)訂閱過的對象肩狂。
  2. 發(fā)布者與訂閱者耦合性降低,發(fā)布者只管發(fā)布一條消息出去姥饰,它不關(guān)心這條消息如何被訂閱者使用傻谁,同時(shí),訂閱者只監(jiān)聽發(fā)布者的事件名列粪,只要發(fā)布者的事件名不變栅螟,它不管發(fā)布者如何改變;同理賣家(發(fā)布者)它只需要將鞋子來貨的這件事告訴訂閱者(買家)篱竭,他不管買家到底買還是不買,還是買其他賣家的步绸。只要鞋子到貨了就通知訂閱者即可掺逼。

發(fā)布訂閱模式的缺點(diǎn):

創(chuàng)建訂閱者需要消耗一定的時(shí)間和內(nèi)存。如果過度使用的話瓤介,反而使代碼不好理解及代碼不好維護(hù)等等吕喘。

如何實(shí)現(xiàn)發(fā)布訂閱模式赘那?

  1. 首先要想好誰是發(fā)布者(比如上面的賣家)。
  2. 然后給發(fā)布者添加一個(gè)緩存列表氯质,用于存放回調(diào)函數(shù)來通知訂閱者(比如上面的買家收藏了賣家的店鋪募舟,賣家通過收藏了該店鋪的一個(gè)列表名單)。
  3. 最后就是發(fā)布消息闻察,發(fā)布者遍歷這個(gè)緩存列表拱礁,依次觸發(fā)里面存放的訂閱者回調(diào)函數(shù)。

實(shí)戰(zhàn)

發(fā)布訂閱模式是最經(jīng)典的設(shè)計(jì)模式之一辕漂,介紹的文章也非常多呢灶。這里不打算過多介紹。直接上代碼~~~

var Event = (function(){
    var list = {},
          listen,
          trigger,
          remove;
          listen = function(key,fn){
            if(!list[key]) {
                // 如果還沒有訂閱過此類消息钉嘹,給該類消息創(chuàng)建一個(gè)緩存列表
                list[key] = [];
            }
            list[key].push(fn); // 訂閱消息添加到緩存列表
        };
        trigger = function(){
            var key = Array.prototype.shift.call(arguments), // 取出消息類型名稱
                 fns = list[key]; // 取出該消息對應(yīng)的回調(diào)函數(shù)的集合
            // 如果沒有訂閱過該消息的話鸯乃,則返回
            if(!fns || fns.length === 0) {
                return false;
            }
            for(var i = 0, fn; fn = fns[i++];) {
                fn.apply(this,arguments); // arguments 是發(fā)布消息時(shí)附送的參數(shù)
            }
        };
        remove = function(key,fn){
            // 如果key對應(yīng)的消息沒有訂閱過的話,則返回
            var fns = list[key];
            // 如果沒有傳入具體的回調(diào)函數(shù)跋涣,表示需要取消key對應(yīng)消息的所有訂閱
            if(!fns) {
                return false;
            }
            if(!fn) {
                fns && (fns.length = 0);
            }else {
                for(var i = fns.length - 1; i >= 0; i--){
                    var _fn = fns[i];
                    if(_fn === fn) {
                        fns.splice(i,1);// 刪除訂閱者的回調(diào)函數(shù)
                    }
                }
            }
        };
        return {
            listen: listen,
            trigger: trigger,
            remove: remove
        }
})();
// 測試代碼如下:
Event.listen("color",function(size) {
    console.log("尺碼為:"+size); // 打印出尺碼為42
});
Event.trigger("color",42);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缨睡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陈辱,更是在濱河造成了極大的恐慌奖年,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性置,死亡現(xiàn)場離奇詭異拾并,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹏浅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門嗅义,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隐砸,你說我怎么就攤上這事之碗。” “怎么了季希?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵褪那,是天一觀的道長。 經(jīng)常有香客問我式塌,道長博敬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任峰尝,我火速辦了婚禮偏窝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己祭往,他們只是感情好伦意,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硼补,像睡著了一般驮肉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上已骇,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天离钝,我揣著相機(jī)與錄音,去河邊找鬼疾捍。 笑死奈辰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乱豆。 我是一名探鬼主播奖恰,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宛裕!你這毒婦竟也來了瑟啃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揩尸,失蹤者是張志新(化名)和其女友劉穎蛹屿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岩榆,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡错负,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勇边。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犹撒。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粒褒,靈堂內(nèi)的尸體忽然破棺而出识颊,到底是詐尸還是另有隱情,我是刑警寧澤奕坟,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布祥款,位于F島的核電站,受9級特大地震影響月杉,放射性物質(zhì)發(fā)生泄漏刃跛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一苛萎、第九天 我趴在偏房一處隱蔽的房頂上張望奠伪。 院中可真熱鬧跌帐,春花似錦、人聲如沸绊率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滤否。三九已至,卻和暖如春最仑,著一層夾襖步出監(jiān)牢的瞬間藐俺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工泥彤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓吟吝,卻偏偏與公主長得像菱父,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子剑逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

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

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品浙宜,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式蛹磺。簡單...
    舟漁行舟閱讀 7,761評論 2 17
  • 1.發(fā)布訂閱模式介紹 發(fā)布---訂閱模式又叫觀察者模式粟瞬,它定義了對象間的一種一對多的關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽...
    JSUED閱讀 785評論 1 4
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 騎著車,在路上俗或,很輕松市怎,一點(diǎn)兒也不費(fèi)力,風(fēng)在耳邊喝蕴侣,太陽就這么斜著射來焰轻,很愜意,心情很美麗昆雀。 猛然間辱志,驚醒,哎狞膘,不...
    南木的小屋閱讀 318評論 5 2
  • 當(dāng)一般人追求學(xué)而優(yōu)則仕的時(shí)候揩懒,莊子選擇無用。這個(gè)無用我認(rèn)為和“塞翁失馬挽封,焉知非敢亚颍”的意思,形體無用可以不必服兵役和...
    愛同哥的奧利奧閱讀 234評論 0 0