js设计模式--观察者模(发布订阅模式)
来源:互联网 发布:英迈零售软件 编辑:程序博客网 时间:2024/05/20 05:54
观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
使用观察者模式的好处:
支持简单的广播通信,自动通知所有已经订阅过的对象。
页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。
目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。
首先来一个例子,利用js原型特性实现观察者模式:
function Observer() { this.fns = []; } Observer.prototype = { subscribe:function(fn) { var that = this; that.fns.push(fn); }, unsubscribe:function(fn) { var that = this; that.fns = that.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('bry1: ' + data + ', 赶紧干活了!'); }; var f2 = function (data) { console.log('bry2: ' + data + ', 找他加点工资去!'); }; o.subscribe(f1); o.subscribe(f2); o.update("老板回来了!") //退订f1 o.unsubscribe(f1); //再来验证 o.update("老板回来了!");
输出结果
bry1: 老板回来了!, 赶紧干活了!index.html:123 bry2: 老板回来了!, 找他加点工资去!index.html:123 bry2: 老板回来了!, 找他加点工资去!
再来一种创建形式,利用对象创建观察者模式
var pubsub = { topics : {}, // 回调函数存放的数组 subUid : -1, //订阅方法 subscribe : function (type, func) { if (! this.topics[type]) { this.topics[type] = []; } var token = (++ this.subUid).toString(); this.topics[type].push({ token: token, func: func }); return token; }, // 发布方法 -- 通知 publish : function (type, args) { var that = this; if (! that.topics[type]) { return false; } setTimeout(function () { var subscribers = that.topics[type], len = subscribers ? subscribers.length : 0; while (len--) { subscribers[len].func(type, args); } }, 0); return true; }, //退订方法 unsubscribe : function (token) { for (var m in this.topics) { if (this.topics[m]) { for (var i = 0, j = this.topics[m].length; i < j; i++) { if ( this.topics[m][i].token === token) { this.topics[m].splice(i, 1); return token; } } } } return false; } }; //来,订阅一个 pubsub.subscribe('example1', function (type, data) { console.log(type + ": " + data); }); pubsub.subscribe('example1', function (type, data) { console.log("brydemo-" + type + ": " + data); }); pubsub.subscribe('example2', function (type, data) { console.log("订阅的第二种类型-" + type + ": " + data); }); //发布通知 pubsub.publish('example2', 'hello world!');
输出结果:
订阅的第二种类型-example2: hello world!
阅读全文
0 0
- js设计模式--观察者模(发布订阅模式)
- java设计模式-观察者(发布-订阅)模式
- 观察者模式--发布/订阅模式
- 十六 设计模式之观察者模式(发布订阅模式)
- 监听器设计模式(观察者模式、订阅发布模式)
- 设计模式之观察者模式(发布-订阅模式)
- [设计模式] 观察者模式(发布-订阅/Publish-subscribe模式)
- 我理解的设计模式:观察者模式(订阅发布模式)
- Javascript设计模式-07-观察者模式(发布订阅模式)
- 设计模式二:观察者模式(发布订阅模式)
- JS设计模式之发布订阅模式
- java笔记--设计模式之观察者(订阅/发布)模式
- 设计模式(三)观察者模式Observer(发布订阅)
- 浅析JavaScript设计模式——发布-订阅/观察者模式
- 观察者(发布-订阅)模式浅析
- js:发布订阅模式
- 【JS】发布/订阅模式
- js:发布-订阅模式
- Java Socket网络编程(二)
- LeetCode 26. Remove Duplicates from Sorted Array
- LeetCode:Combination Sum
- 记201607-201707实习收获
- 涂鸦电话面试一面
- js设计模式--观察者模(发布订阅模式)
- TCP 的那些事儿
- C# 绘制50000个矩形框
- Android 判断当前的网络状态
- Unity 2D游戏制作
- 安装maven后,运行mvn help:system报Non-parseable错误
- AngularJS杂记4----模型 ng-model
- Java Web学习总结53:Web应用中使用JavaMail发送邮件
- yarn使用cgroup隔离cpu资源