發布訂閱和觀察者模式的區別

2021-10-03 05:08:20 字數 1456 閱讀 8792

有些人認為觀察者模式就是發布訂閱模式,實際上觀察者模式是包含了訂閱發布模式,發布訂閱模式只是觀察者模式中的一種。觀察者模式是觀察者和被觀察者之間的通訊,而發布訂閱模式中間增加了乙個中轉層,通過第三方來分發資訊。

// subject為被觀察者,subject中的狀態(state)改變,就通知 observer更新

class subject

// this.observes儲存觀察者

attach(observe)

// 狀態改變,通知 observer 觸發更新

setstate(newstate)

}// observer為觀察者,觀察subject的狀態是否改變

class observer

// 更新

update(state)

}var sub = new subject()

var obs1 = new observer('觀察者1')

var obs2 = new observer('觀察者2')

sub.attach(obs1)

sub.attach(obs2)

// 被觀察者的狀態改變,觸發觀察者更新

sub.setstate(true)

vue中資料劫持中就用到了觀察者模式,data中的屬性一發生變化,就通知view介面更新,從而實現資料驅動,想要進一步了解vue底層原理,可以參考可以參考github上的一篇文章 ☛ mvvm實現

// 發布訂閱

class events // 容器

}// 根絕不同 name,訂閱對應函式

$on(name, fn)

// 遍歷所有相同name的訂閱函式,並發布

$emit(name, ...args) )

}// 銷毀,避免記憶體洩漏

$of(name)

}// event 相當於中轉器

const event = new events()

// 訂閱

event.$on('eventname', function (a, b) )

event.$on('eventname', function (a, b) )

// 發布

event.$emit('eventname', 'a', 'b')

vue中的兄弟元件通訊bus的原理就是發布訂閱模式,該模式有個缺點,當你訂閱乙個訊息後,也許此訊息最後都未發生,但這個訂閱者會始終存在於記憶體中。所以該訊息不使用的時候,呼叫$of銷毀,以避免記憶體洩漏。

總而言之,在觀察者模式中,觀察者(observer)是知道subject的,subject一直保持對觀察者進行記錄。然而,在發布訂閱模式中,發布者和訂閱者不知道對方的存在。它們只有通過訊息**進行通訊。觀察者模式大多數時候是同步的,比如當事件觸發,subject就會去呼叫觀察者的方法。而發布訂閱模式大多數時候是非同步的。

觀察者和發布訂閱模式的區別

觀察者和發布訂閱模式的區別 觀察者模式和發布訂閱模式有什麼區別?大多數的回答都是 publishers subscribers observer pattern,24種基本的設計模式並沒有發布 訂閱模式,發布訂閱模式屬於並髮型模式 像典型的mq 這兩種相似單並不可以劃等號。我們來重新來回顧一下這兩種...

觀察者模式和發布訂閱模式的區別

兩者有什麼區別?一搜一大堆,一篇比一篇長,一篇比一篇專業。傻傻分不清楚。還是舉個例子吧。觀察者模式 我辦了乙個補習班,學生想來我這學習,必須先報名 註冊 收齊一幫學生,開始教學,學生們聽了我的課及時更新了自己的認知。我和學生們緊密相連。每個人我都認識。後者比前者多了乙個類似中轉站的東西 姑且稱為 中...

觀察者模式和發布 訂閱模式的區別

有這麼一段 經常會出現在 中 1 var pubsub 3function subscribe topic,fn 7topics topic push fn 8 9function publish topic,args 15 16return 20 測試 1 pubsub.subscribe tes...