摘要:舉個(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ī)店。等到賣家A的Gopro相機(jī)打折后,淘寶會(huì)向這3個(gè)人推送打折消息。
其中這3個(gè)買家之間是沒有任何依賴關(guān)系的,并不知道對(duì)方。當(dāng)一個(gè)買家不打算買這家店的相機(jī),取消關(guān)注后,對(duì)其他2個(gè)買家沒有任何影響,唯一不同的是,賣家A的Gopro相機(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", "你好")
從Observer和Mediator實(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
摘要:大意就是作者把種不斷的重組歸納抽象直道最后抽象為一種設(shè)計(jì)模式,。而所有的關(guān)注的核心問題就是如何控制信息流但是我個(gè)人認(rèn)為核心是如何解耦。再根據(jù)信息流劃分出對(duì)象在系統(tǒng)中擔(dān)任的種角色,。所以歸為一種核心所有的的職責(zé)都是控制。 Overview 今天看了YouTube上的一個(gè)講Design Pattern的視頻,把這個(gè)視頻的大意給大家分享一下,該視頻的作者是Anthony Ferrara。 ...
摘要:但是發(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種...
摘要:源碼剖析之設(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ì)去思考其在目...
摘要:代碼實(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ì)出來...
摘要:那在我們的程序設(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)得起雞皮疙瘩。不過...
閱讀 2864·2023-04-25 20:06
閱讀 1484·2021-08-26 14:15
閱讀 2269·2021-08-12 13:27
閱讀 1808·2019-08-30 15:55
閱讀 3499·2019-08-30 13:20
閱讀 2855·2019-08-29 15:12
閱讀 3358·2019-08-29 15:06
閱讀 2888·2019-08-29 14:13