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