觀察者模式分為兩個對象訂閱者和發(fā)布者,訂閱者可以有多個,原理就是發(fā)布者將訂閱者的對象指針保存下來,如果有消息了需要通知了,那么發(fā)布者遍歷訂閱者的對象,然后分別調(diào)用他們的方法,將值傳過去.
例子:
// 創(chuàng)建發(fā)布者
function Publisher(){
var observice = [] // 發(fā)布者內(nèi)部定義一個屬性,用于存儲訂閱者對象的指針
}
Publisher.prototype.add = function (observice) { // 發(fā)布者定義一個方法向自身的屬性中添加訂閱者
var flag = false
this.observice.map(function (item) {
if (item === observice) {
flag = true
}
})
if (!flag) {
this.observice.push(observice)
}
}
Publisher.prototype.send = function (state) { // 發(fā)布者發(fā)布消息
this.observice.map(function (item) {
item.update(item)
})
return this
}
而對于訂閱者來說,只需要實現(xiàn)update方法即可,例子如下:
function Subscriber(){}
Subscriber.prototype.update = function (event) {}
使用如下:
var p = new?Publisher()
var s1 = new?Subscriber()
s1.update = function () {} // 根據(jù)需要重寫update方法
p.add(s1) // 將s1添加到發(fā)布者的存儲列表中
s1.send('發(fā)布了') // 調(diào)用發(fā)送方法