摘要:舉個例子淘寶商鋪賣家在淘寶上開了一個相機店最近都有意愿去買但是覺得價格稍貴,因此暫時不打算入手,想等價格稍微便宜一點后再入手,所以這個人通過淘寶先關(guān)注賣家的相機店。等到賣家的相機打折后,淘寶會向這個人推送打折消息。
Observer觀察者模式
Observer觀察者模式和Pub/sub模式事實上都是同一套路。這種模式建立起了不同對象之間的依賴關(guān)系:
當(dāng)一個對象觸發(fā)某個方法,或者發(fā)生變化時,其他關(guān)注這個對象的對象們,也會響應(yīng)這個對象的變化。
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對observer的依賴 observer.watchBy(subjectOne, "scroll") // 定義subjectTwo對observer的依賴 observer.watchBy(subjectTwo, "scroll") // 當(dāng)observer觸發(fā)scroll事件的時候,subjectOne會響應(yīng)這個事件 subjectOne.notice = function (evt) { const { sender, receiver } = evt // do something } // 當(dāng)observer觸發(fā)scroll事件的時候,subjectTwo會響應(yīng)這個事件 subjectTwo.notice = function (evt) { const { sender, receiver } = evt // do something }
顯然,在需要建立依賴關(guān)系不多的幾個對象中,使用Observer模式可以很好的將不同對象之間進行解耦:定義一個被觀察者的主體,然后添加觀察者對被觀察者的依賴關(guān)系。但是需要建立依賴關(guān)系的對象一旦多起來,那么大家也可以想象下,自己手動去維護這些依賴關(guān)系是多么的蛋疼。
Mediator中介者模式基本的套路就是:提供一個中介對象Mediator,這個中介對象就是其他所有對象之間的聯(lián)系紐帶,其他所有對象相互之間沒有沒有任何的依賴關(guān)系,事件的訂閱及發(fā)布統(tǒng)一讓Mediator去操作。其他所有的對象需要做的就是提供給Mediator需要發(fā)布的事件,以及訂閱Mediator上能提供的事件。
舉個例子:
淘寶商鋪:賣家A在淘寶上開了一個Gopro相機店,b, c, d最近都有意愿去買Gopro,但是覺得價格稍貴,因此暫時不打算入手,想等價格稍微便宜一點后再入手,所以這3個人通過淘寶先關(guān)注賣家A的相機店。等到賣家A的Gopro相機打折后,淘寶會向這3個人推送打折消息。
其中這3個買家之間是沒有任何依賴關(guān)系的,并不知道對方。當(dāng)一個買家不打算買這家店的相機,取消關(guān)注后,對其他2個買家沒有任何影響,唯一不同的是,賣家A的Gopro相機打折后,淘寶只會通知仍然關(guān)注賣家A的2個買家
在這個例子當(dāng)中:
淘寶: Mediator
賣家A: 發(fā)布者
買家B/C/D: 訂閱者
發(fā)布者通過Mediator去發(fā)布消息,Mediator再去通知其他的訂閱者
簡單的實現(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", "你好")
從Observer和Mediator實現(xiàn)的套路上來看,二者都有相似之處,就是訂閱者訂閱發(fā)布者發(fā)布的消息,但是Observer是訂閱者和發(fā)布者直接產(chǎn)生依賴關(guān)系,當(dāng)依賴關(guān)系變多起來就不好處理了。而Mediator是在訂閱者和發(fā)布者中間加了一個中介者,由這個中介者去管理不同對象之間的訂閱發(fā)布關(guān)系,這樣的好處就是訂閱者和發(fā)布者不產(chǎn)生直接的依賴關(guān)系,統(tǒng)一交給中介者去維護。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/82638.html
摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個人認為核心是如何解耦。再根據(jù)信息流劃分出對象在系統(tǒng)中擔(dān)任的種角色,。所以歸為一種核心所有的的職責(zé)都是控制。 Overview 今天看了YouTube上的一個講Design Pattern的視頻,把這個視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...
摘要:但是發(fā)出者并不清楚到底最終那個對象會處理該請求,所以,責(zé)任鏈模式可以實現(xiàn),在隱瞞客戶端的情況下,對系統(tǒng)進行動態(tài)的調(diào)整。因為訪問者模式使得算法操作增加變得容易。訪問者模式將有關(guān)行為集中到一個訪問者對象中,其改變不影響系統(tǒng)數(shù)據(jù)結(jié)構(gòu)。 總體分為3大類:創(chuàng)建型模式 (5種):工廠方法、抽象工廠、單例、建造者、原型結(jié)構(gòu)型模式(7種):適配器、裝飾器、代理、外觀、橋接、組合、享元行為型模式(11種...
摘要:源碼剖析之設(shè)計模式鑒賞策略模式小結(jié)在這篇文章中筆者和大家分享幾個減少的小由于這些都會有一定的限制因此還向大家介紹了幾個能夠避免寫出糟糕的的設(shè)計模式并使用觀察者模式簡單的改進了仲裁者模式的例子 本文首發(fā)于數(shù)據(jù)浮云:https://mp.weixin.qq.com/s?__... 在寫代碼的日常中,if...else語句是極為常見的.正因其常見性,很多同學(xué)在寫代碼的時候并不會去思考其在目...
摘要:代碼實現(xiàn)迭代器模式注意被迭代對象屬性是私有的觀察者模式又叫發(fā)布訂閱模式,當(dāng)一個主體對象發(fā)生改變時,依賴它的多個觀察者對象都得到通知并自動更新響應(yīng)。 在上一篇我們講了結(jié)構(gòu)型模式,結(jié)構(gòu)型模式是討論類和對象的結(jié)構(gòu)的??偣灿?種。而今天我們來介紹一下行為型模式。 一、什么是行為型模式? 1、設(shè)計模式: 是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計的總結(jié)。就好像杯子,是被前人設(shè)計出來...
摘要:那在我們的程序設(shè)計中有沒有這樣的模式有的,中介者模式應(yīng)運而生,目的就是處理這樣的情景問題。最后來看客戶端的實現(xiàn),代碼如下被攻打,請求支援可以看到,表面上請求還是從發(fā)出,但是已經(jīng)委托了中介者進行業(yè)務(wù)邏輯和流程的處理。 本篇文章已授權(quán)微信公眾號 guolin_blog (郭霖)獨家發(fā)布 小時候鐘愛戰(zhàn)爭片,《地道戰(zhàn)》、《雞毛信》、《鐵道游擊隊》一系列的老電影,咦~想起都激動得起雞皮疙瘩。不過...
閱讀 2935·2023-04-25 20:06
閱讀 1556·2021-08-26 14:15
閱讀 2315·2021-08-12 13:27
閱讀 1860·2019-08-30 15:55
閱讀 3547·2019-08-30 13:20
閱讀 2915·2019-08-29 15:12
閱讀 3406·2019-08-29 15:06
閱讀 2963·2019-08-29 14:13