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