成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Observer和Mediator模式的區(qū)別

wapeyang / 1185人閱讀

摘要:舉個(gè)例子淘寶商鋪賣家在淘寶上開了一個(gè)相機(jī)店最近都有意愿去買但是覺得價(jià)格稍貴,因此暫時(shí)不打算入手,想等價(jià)格稍微便宜一點(diǎn)后再入手,所以這個(gè)人通過淘寶先關(guān)注賣家的相機(jī)店。等到賣家的相機(jī)打折后,淘寶會(huì)向這個(gè)人推送打折消息。

Observer觀察者模式

Observer觀察者模式和Pub/sub模式事實(shí)上都是同一套路。這種模式建立起了不同對(duì)象之間的依賴關(guān)系:

當(dāng)一個(gè)對(duì)象觸發(fā)某個(gè)方法,或者發(fā)生變化時(shí),其他關(guān)注這個(gè)對(duì)象的對(duì)象們,也會(huì)響應(yīng)這個(gè)對(duì)象的變化。

    function setObserverBehavior (subjects) {
        if (!Array.isArray(subjects)) {
            if (subjects.length) {
                subjects = Array.from(subjects)
            } else {
                subjects = [subjects]
            }
        }
        
        subjects.forEach(function (subject) {
            subject.watchBy = function (target, type) {
                subject.addEventListener(type, function (evt) {
                    evt.sender = subject
                    evt.recevier = target
                    target.notice && target.notice(evt)
                })
            }
        })
    }
    
    setObserverBehavior(observer)
    // 定義subjectOne對(duì)observer的依賴
    observer.watchBy(subjectOne, "scroll")
    // 定義subjectTwo對(duì)observer的依賴
    observer.watchBy(subjectTwo, "scroll")
    
    // 當(dāng)observer觸發(fā)scroll事件的時(shí)候,subjectOne會(huì)響應(yīng)這個(gè)事件
    subjectOne.notice = function (evt) {
        const { sender, receiver } = evt
        // do something
    }
    
    // 當(dāng)observer觸發(fā)scroll事件的時(shí)候,subjectTwo會(huì)響應(yīng)這個(gè)事件
    subjectTwo.notice = function (evt) {
        const { sender, receiver } = evt
        // do something
    }

顯然,在需要建立依賴關(guān)系不多的幾個(gè)對(duì)象中,使用Observer模式可以很好的將不同對(duì)象之間進(jìn)行解耦:定義一個(gè)被觀察者的主體,然后添加觀察者對(duì)被觀察者的依賴關(guān)系。但是需要建立依賴關(guān)系的對(duì)象一旦多起來,那么大家也可以想象下,自己手動(dòng)去維護(hù)這些依賴關(guān)系是多么的蛋疼。

Mediator中介者模式

基本的套路就是:提供一個(gè)中介對(duì)象Mediator,這個(gè)中介對(duì)象就是其他所有對(duì)象之間的聯(lián)系紐帶,其他所有對(duì)象相互之間沒有沒有任何的依賴關(guān)系,事件的訂閱及發(fā)布統(tǒng)一讓Mediator去操作。其他所有的對(duì)象需要做的就是提供給Mediator需要發(fā)布的事件,以及訂閱Mediator上能提供的事件。

舉個(gè)例子:

淘寶商鋪:賣家A淘寶上開了一個(gè)Gopro相機(jī)店,b, c, d最近都有意愿去買Gopro,但是覺得價(jià)格稍貴,因此暫時(shí)不打算入手,想等價(jià)格稍微便宜一點(diǎn)后再入手,所以這3個(gè)人通過淘寶先關(guān)注賣家A的相機(jī)店。等到賣家AGopro相機(jī)打折后,淘寶會(huì)向這3個(gè)人推送打折消息。

其中這3個(gè)買家之間是沒有任何依賴關(guān)系的,并不知道對(duì)方。當(dāng)一個(gè)買家不打算買這家店的相機(jī),取消關(guān)注后,對(duì)其他2個(gè)買家沒有任何影響,唯一不同的是,賣家AGopro相機(jī)打折后,淘寶只會(huì)通知仍然關(guān)注賣家A的2個(gè)買家

在這個(gè)例子當(dāng)中:

淘寶: Mediator

賣家A: 發(fā)布者

買家B/C/D: 訂閱者

發(fā)布者通過Mediator去發(fā)布消息,Mediator再去通知其他的訂閱者

簡(jiǎn)單的實(shí)現(xiàn):

    class Mediator {
        constructor () {
            this.subscribers = {}
        }
        
        pubNotice (type, obj) {
            this.subscribers[type] = this.subscribers[type] || []
            this.subscribers[type].forEach(sub => {
                sub(obj)
            })
        }
        
        subNotice (type, target, fn) {
            this.subscribers[type] = this.subscribers[type] || []
            this.subscribers[type].push(fn)
        }
    }
    
    const sub1 = {
        sayHi(data) {
        console.log(`sub1 get the data ${data}`)
        }
    }

    const sub2 = {
        sayHi(data) {
            console.log(`sub2 get the data ${data}`)
        } 
    }

    const mediator = new Mediator()

    mediator.subNotice("sayHi", sub1, sub1.sayHi)
    mediator.subNotice("sayHi", sub2, sub2.sayHi)

    mediator.removeNotice("sayHi", sub2, sub2.sayHi)

    mediator.pubNotice("sayHi", "你好")

ObserverMediator實(shí)現(xiàn)的套路上來看,二者都有相似之處,就是訂閱者訂閱發(fā)布者發(fā)布的消息,但是Observer訂閱者發(fā)布者直接產(chǎn)生依賴關(guān)系,當(dāng)依賴關(guān)系變多起來就不好處理了。而Mediator是在訂閱者發(fā)布者中間加了一個(gè)中介者,由這個(gè)中介者去管理不同對(duì)象之間的訂閱發(fā)布關(guān)系,這樣的好處就是訂閱者發(fā)布者不產(chǎn)生直接的依賴關(guān)系,統(tǒng)一交給中介者去維護(hù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82638.html

相關(guān)文章

  • Design Pattern萬劍歸宗 => Mediator

    摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計(jì)模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個(gè)人認(rèn)為核心是如何解耦。再根據(jù)信息流劃分出對(duì)象在系統(tǒng)中擔(dān)任的種角色,。所以歸為一種核心所有的的職責(zé)都是控制。 Overview 今天看了YouTube上的一個(gè)講Design Pattern的視頻,把這個(gè)視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...

    yuanzhanghu 評(píng)論0 收藏0
  • 行為型模式

    摘要:但是發(fā)出者并不清楚到底最終那個(gè)對(duì)象會(huì)處理該請(qǐng)求,所以,責(zé)任鏈模式可以實(shí)現(xiàn),在隱瞞客戶端的情況下,對(duì)系統(tǒng)進(jìn)行動(dòng)態(tài)的調(diào)整。因?yàn)樵L問者模式使得算法操作增加變得容易。訪問者模式將有關(guān)行為集中到一個(gè)訪問者對(duì)象中,其改變不影響系統(tǒng)數(shù)據(jù)結(jié)構(gòu)。 總體分為3大類:創(chuàng)建型模式 (5種):工廠方法、抽象工廠、單例、建造者、原型結(jié)構(gòu)型模式(7種):適配器、裝飾器、代理、外觀、橋接、組合、享元行為型模式(11種...

    why_rookie 評(píng)論0 收藏0
  • 談?wù)劥a——如何避免寫出糟糕if...else語(yǔ)句

    摘要:源碼剖析之設(shè)計(jì)模式鑒賞策略模式小結(jié)在這篇文章中筆者和大家分享幾個(gè)減少的小由于這些都會(huì)有一定的限制因此還向大家介紹了幾個(gè)能夠避免寫出糟糕的的設(shè)計(jì)模式并使用觀察者模式簡(jiǎn)單的改進(jìn)了仲裁者模式的例子 本文首發(fā)于數(shù)據(jù)浮云:https://mp.weixin.qq.com/s?__... 在寫代碼的日常中,if...else語(yǔ)句是極為常見的.正因其常見性,很多同學(xué)在寫代碼的時(shí)候并不會(huì)去思考其在目...

    huhud 評(píng)論0 收藏0
  • 【編程課堂】Php設(shè)計(jì)模式(三):行為型模式

    摘要:代碼實(shí)現(xiàn)迭代器模式注意被迭代對(duì)象屬性是私有的觀察者模式又叫發(fā)布訂閱模式,當(dāng)一個(gè)主體對(duì)象發(fā)生改變時(shí),依賴它的多個(gè)觀察者對(duì)象都得到通知并自動(dòng)更新響應(yīng)。 在上一篇我們講了結(jié)構(gòu)型模式,結(jié)構(gòu)型模式是討論類和對(duì)象的結(jié)構(gòu)的??偣灿?種。而今天我們來介紹一下行為型模式。 一、什么是行為型模式? 1、設(shè)計(jì)模式: 是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)的總結(jié)。就好像杯子,是被前人設(shè)計(jì)出來...

    starsfun 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式-中介者模式

    摘要:那在我們的程序設(shè)計(jì)中有沒有這樣的模式有的,中介者模式應(yīng)運(yùn)而生,目的就是處理這樣的情景問題。最后來看客戶端的實(shí)現(xiàn),代碼如下被攻打,請(qǐng)求支援可以看到,表面上請(qǐng)求還是從發(fā)出,但是已經(jīng)委托了中介者進(jìn)行業(yè)務(wù)邏輯和流程的處理。 本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布 小時(shí)候鐘愛戰(zhàn)爭(zhēng)片,《地道戰(zhàn)》、《雞毛信》、《鐵道游擊隊(duì)》一系列的老電影,咦~想起都激動(dòng)得起雞皮疙瘩。不過...

    SimonMa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<