JavaScript設計模式-- 觀察者(Observer)模式(又稱: 訂閱模式)
定義: 為一對多關係。也就是讓多個觀察者能同時監聽某一主題物件。一旦這個主題物件狀態有改變, 就馬上通知觀察者。最顯著的例子就是JavaScript的事件。
e.g.
var MessageCenter = {
list: {}, // 記錄有哪些用戶有訂閱事件, 以便之後送東西給用戶
emit: function(type, message) {
if (this.list[type]) { // 用字串判斷是否有"todo"或"test"屬性
for (var i = 0; i < this.list[type].length; i++) {
this.list[type][i](message); // message把訊息傳入callback()
}
}
},
on: function(type, callback) { // on這方法在做註冊的動作
this.list[type] = this.list[type] || []; //如已有陣列就保存目前陣列, 不然就初始化(給空陣列)
this.list[type].push(callback); // 用push()把callback()放入
}
};
function User(messageCenter) {
this.messageCenter = messageCenter;
}
User.prototype.addEvent = function(type, callback) { // type是事件類型; callback是事件的callback()
this.messageCenter.on(type, callback);
};
var UserA = new User(MessageCenter);
UserA.addEvent("todo", function(msg) { // msg是取得事件發生時所傳入的參數
console.log("UserA todo:" + msg);
});
UserA.addEvent("test", function(msg) {
console.log("UserA test:" + msg);
});
var UserB = new User(MessageCenter);
UserB.addEvent("todo", function(msg) {
console.log("UserB todo:" + msg);
});
var UserC = new User(MessageCenter);
UserC.addEvent("test", function(msg) {
console.log("UserC test:" + msg);
});
MessageCenter.emit("todo", "News"); //"News"是要傳入的訊息內容
程式碼結果: (因UserC沒有註冊todo事件類型, 所以沒被通知)
// UserA todo:News
// UserB todo:News
p.s. 把常見的JavaScript設計模式都介紹完囉!
e.g.
var MessageCenter = {
list: {}, // 記錄有哪些用戶有訂閱事件, 以便之後送東西給用戶
emit: function(type, message) {
if (this.list[type]) { // 用字串判斷是否有"todo"或"test"屬性
for (var i = 0; i < this.list[type].length; i++) {
this.list[type][i](message); // message把訊息傳入callback()
}
}
},
on: function(type, callback) { // on這方法在做註冊的動作
this.list[type] = this.list[type] || []; //如已有陣列就保存目前陣列, 不然就初始化(給空陣列)
this.list[type].push(callback); // 用push()把callback()放入
}
};
function User(messageCenter) {
this.messageCenter = messageCenter;
}
User.prototype.addEvent = function(type, callback) { // type是事件類型; callback是事件的callback()
this.messageCenter.on(type, callback);
};
var UserA = new User(MessageCenter);
UserA.addEvent("todo", function(msg) { // msg是取得事件發生時所傳入的參數
console.log("UserA todo:" + msg);
});
UserA.addEvent("test", function(msg) {
console.log("UserA test:" + msg);
});
var UserB = new User(MessageCenter);
UserB.addEvent("todo", function(msg) {
console.log("UserB todo:" + msg);
});
var UserC = new User(MessageCenter);
UserC.addEvent("test", function(msg) {
console.log("UserC test:" + msg);
});
MessageCenter.emit("todo", "News"); //"News"是要傳入的訊息內容
程式碼結果: (因UserC沒有註冊todo事件類型, 所以沒被通知)
// UserA todo:News
// UserB todo:News
p.s. 把常見的JavaScript設計模式都介紹完囉!
留言
張貼留言