定义
观察都模式定义了对象间的一对多依赖关系,因此当一个对象的状态发生改变,所有其他有依赖关系的对象将自动被通知和更新
总结
观察都模式提供了一个订阅模型,当对象订阅了一个事件后,当事件发生后将会被通知。这个模式是包括javascript在内的事件驱动编程的基石。观察都模式使用面向对象设计变得容易,也促进解藕。
当创建网页应用程序你可能要写很多事件处理函数,当发生特定的事件,这些函数将会被触发。这些通知有选择地接收一个关于这个事件的带明细的事件参数(比如:点击事件中将有鼠标的x和y的位置)。
这个javascript事件和事件处理函数范例就是一个观察都模式,它的另一个叫法是发布/订阅模式。
例子
以click事件为例:
主题可以是click,维护一系列的观察者,提供一个接口给观察者订阅或者退订,当状态改变时向观察都发送通知。
而各观察者是各clickHandler,是一系列的函数,当主题状态改变时将被通知触发。
代码样版
代码来源于网络
// 方式一 function Observer() { this.fns = []; } Observer.prototype = { subscribe: function (fn) { this.fns.push(fn); }, unsubscribe: function (fn) { this.fns = this.fns.filter( function (el) { if (el !== fn) { return el; } } ); }, update: function (o, thisObj) { var scope = thisObj || window; this.fns.forEach( function (el) { el.call(scope, o); } ); } }; // 测试 var o = new Observer; var f1 = function (data) { console.log('Robbin: ' + data + ', 赶紧干活了!'); }; var f2 = function (data) { console.log('Randall: ' + data + ', 找他加点工资去!'); }; o.subscribe(f1); o.subscribe(f2); o.update("Tom回来了!") // 退订f1 o.unsubscribe(f1); //再来验证 o.update("Tom回来了!"); // 方式二 // 通用代码 var observer = { // 订阅 addSubscriber: function (callback) { this.subscribers[this.subscribers.length] = callback; }, // 退订 removeSubscriber: function (callback) { for (var i = 0; i < this.subscribers.length; i++) { if (this.subscribers[i] === callback) { delete (this.subscribers[i]); } } }, // 发布 publish: function (what) { for (var i = 0; i < this.subscribers.length; i++) { if (typeof this.subscribers[i] === 'function') { this.subscribers[i](what); } } }, // 将对象o具有观察者功能 make: function (o) { for (var i in this) { o[i] = this[i]; o.subscribers = []; } } }; var blogger = { recommend: function (obj) { var msg = { userID: obj.userID, bloggerID: obj.bloggerID } this.publish(msg); } }; observer.make(blogger); var updateUI = function (obj) { console.log("第二步:更新界面,id为[" + obj.userID + "]的用户推荐了id为[" + obj.bloggerID + "]的博客!"); } var updateData = function (obj) { console.log("第一步:更新后台数据,id为[" + obj.userID + "]的用户推荐了id为[" + obj.bloggerID + "]的博客!"); } // 订阅 blogger.addSubscriber(updateData); blogger.addSubscriber(updateUI); blogger.recommend({ userID: "65412365", bloggerID: "65412369" }); // 调用发布 // 退订 blogger.removeSubscriber(updateUI); blogger.removeSubscriber(updateData); blogger.recommend({ userID: "65412365", bloggerID: "65412369" }); // 测试退订调用发布
Hey I know this is off topic but I was wondering if you knew of any
widgets I could add to my blog that automatically tweet my newest twitter updates.
I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this.
Please let me know if you run into anything. I truly enjoy reading your blog and
I look forward to your new updates.