Observer
觀察者模式和Pub/sub
模式事實上都是同一套路。這種模式創建起了不一樣對象之間的依賴關係:javascript
當一個對象觸發某個方法,或者發生變化時,其餘關注這個對象的對象們,也會響應這個對象的變化。java
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
模式能夠很好的將不一樣對象之間進行解耦:定義一個被觀察者的主體,而後添加觀察者對被觀察者的依賴關係。可是須要創建依賴關係的對象一旦多起來,那麼你們也能夠想象下,本身手動去維護這些依賴關係是多麼的蛋疼。this
基本的套路就是:提供一箇中介對象Mediator
,這個中介對象就是其餘全部對象之間的聯繫紐帶,其餘全部對象相互之間沒有沒有任何的依賴關係,事件的訂閱及發佈統一讓Mediator
去操做。其餘全部的對象須要作的就是提供給Mediator
須要發佈的事件,以及訂閱Mediator
上能提供的事件。spa
舉個例子:code
淘寶商鋪:賣家A
在淘寶
上開了一個Gopro
相機店,b
, c
, d
最近都有意願去買Gopro
,可是以爲價格稍貴,所以暫時不打算入手,想等價格稍微便宜一點後再入手,因此這3我的經過淘寶
先關注賣家A
的相機店。等到賣家A
的Gopro
相機打折後,淘寶
會向這3我的推送打折消息。server
其中這3個買家之間是沒有任何依賴關係的,並不知道對方。當一個買家不打算買這家店的相機,取消關注後,對其餘2個買家沒有任何影響,惟一不一樣的是,賣家A
的Gopro
相機打折後,淘寶
只會通知仍然關注賣家A
的2個買家對象
在這個例子當中:blog
淘寶: 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
是在訂閱者
和發佈者
中間加了一個中介者
,由這個中介者
去管理不一樣對象之間的訂閱發佈
關係,這樣的好處就是訂閱者
和發佈者
不產生直接的依賴關係,統一交給中介者
去維護。