發(fā)布訂閱模式 和 觀察者模式
發(fā)布訂閱并不是觀察者模式。但我覺(jué)得沒(méi)有必要細(xì)究這個(gè)……同樣的思路不同的寫(xiě)法而已。另外看了這么久,我還是沒(méi)懂訂閱、發(fā)布、觀察這三個(gè)詞是什么意思……
發(fā)布訂閱模式
發(fā)布訂閱的核心是調(diào)度中心;是指由一個(gè)中心來(lái)進(jìn)行事務(wù)的發(fā)布和訂閱;就像Node中的Event模塊。
使用的方式如下:
var event = new Event();
//訂閱消息
event.on("test", function () {
console.log("發(fā)布消息");
});
// 觸發(fā)
event.emit("test");
要實(shí)現(xiàn)這樣一個(gè)發(fā)布訂閱模式是非常簡(jiǎn)單的;當(dāng)然是實(shí)現(xiàn)一個(gè)簡(jiǎn)陋版本的……
var Event = function () {
this.events = {};
}
Event.prototype.on = function (task, callback) {
var list = this.events[task];
list ? list.push(callback) : list = [callback];
}
Event.prototype.emit = function (task) {
var events = this.events;
if (!events[task]) {
return false;
}
for (var i = 0; i < events.length; i++) {
events[i]();
}
}
觀察者模式
觀察者模式與發(fā)布訂閱模式不同的是,觀察者模式一般有兩個(gè)模塊,發(fā)布者和訂閱者(從這點(diǎn)聽(tīng)更應(yīng)該叫發(fā)布/訂閱模式才對(duì)啊……真的是)。簡(jiǎn)單來(lái)講就是分化為兩個(gè)模塊,發(fā)布者訂閱觀察者并手動(dòng)觸發(fā)事件,觀察者定義事件。
class Subject {
constructor() {
this.observerList = []
}
addObserver(observer) {
this.observerList.push(observer)
}
notify(params) {
this.observerList.forEach(observer => {
observer.update(params)
})
}
}
// 觀察者類
class Observer {
constructor(fn) {
this.update = fn
}
}