觀察者模式(又被稱爲發佈-訂閱(Publish/Subscribe)模式,屬於行爲型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知全部的觀察者對象,使他們可以自動更新本身git
觀察者模式 在軟件設計中是一個對象,維護一個依賴列表,當任何狀態發生改變自動通知它們。設計模式
發佈-訂閱模式 消息的發送方,叫作發佈者(publishers),消息不會直接發送給特定的接收者,叫作訂閱者。微信
左邊至關於微信裏的微商-顧客之間的關係。右邊至關於商家-淘寶-顧客之間的關係dom
觀察者模式:顧客關注了微商的商品,微商會記住顧客關注的商品,一旦上新就直接 私聊 通知全部關注這個商品的顧客。這裏的顧客就至關於觀察者,這裏的微商就至關於主題函數
訂閱發佈模式:顧客經過淘寶(APP或者網站)關注了商家的商品,商家一旦上新就經過淘寶(APP或者網站)向關注了它的顧客 羣發 消息。這裏的顧客就是訂閱者,這裏的淘寶就是事件總線,這裏的商家就是發佈者網站
只要咱們曾經在DOM節點上面綁定過事件函數,那咱們就使用過觀察者模式,應爲JS和DOM之間就是實現了一種觀察者模式this
document.body.addEventListener("click", function() { alert("Hello World") },false ) document.body.click() //模擬用戶點擊
// 定義商家 let merchants = {} // 定義預約列表 merchants.orderList = {} // 將增長的預訂者添加到預約客戶列表中 merchants.listen = function(id, info) { if(!this.orderList[id]) { this.orderList[id] = [] } this.orderList[id].push(info) console.log('預約成功') } //發佈消息 merchants.publish = function(id) { let infos = this.orderList[id] // 判斷是否有預訂信息 if(!infos || infos.length === 0) { console.log('您尚未預訂信息!') return } // 若是有預訂信息,則循環打印 infos.forEach((el, index) => { console.log('尊敬的客戶:') el.call(this, arguments) console.log('已經到貨了') }) } merchants.remove = function(id, fn) { // 撤銷訂單 var infos = this.orderList[id] if(infos instanceof Array){ infos.forEach((el, index) => { el === fn && this.orderList[id].splice(index, 1) }) } console.log('撤銷成功') } // 定義一個預訂者customerA,並指定預約信息 let customerA = function() { console.log('黑色至尊版一臺') } let customerB = function() { console.log('白色至尊版一臺') } let customerC = function() { console.log('紅色至尊版一臺') } // customerA 預約手機,並留下預定電話 merchants.listen('15888888888', customerA) // 預約成功 merchants.listen('15888888888', customerB) // 預約成功 merchants.listen('15777777777', customerB) // 預約成功 merchants.listen('15777777777', customerC) // 預約成功 merchants.remove('15888888888', customerB) // 撤銷成功 // 商家發佈通知信息 merchants.publish('15888888888') merchants.publish('15777777777') 預約成功 預約成功 預約成功 預約成功 撤銷成功 尊敬的客戶: 黑色至尊版一臺 已經到貨了 尊敬的客戶: 白色至尊版一臺 已經到貨了 尊敬的客戶: 紅色至尊版一臺 已經到貨了
對於觀察者模式還只是淺薄的認識,若有不對,還請大佬們指出,感謝(✿◕‿◕✿)設計
參考連接code
JavaScript設計模式之觀察者模式server