设计模式学习(六)
来源:互联网 发布:java定时任务 编辑:程序博客网 时间:2024/05/17 12:20
5.发布--订阅模式
- 首先要想好谁是发布者(比如上面的卖家)。
- 然后给发布者添加一个缓存列表,用于存放回调函数来通知订阅者(比如上面的买家收藏了卖家的店铺,卖家通过收藏了该店铺的一个列表名单)。
- 最后就是发布消息,发布者遍历这个缓存列表,依次触发里面存放的订阅者回调函数。
var event= {};(function (q) { var topics = {}, // 回调函数存放的数组 subUid = -1; // 发布方法 q.publish= function (topic, args) { if (!topics[topic]) { return false; } setTimeout(function () { var subscribers = topics[topic], len = subscribers ? subscribers.length : 0; while (len--) { subscribers[len].func(topic, args); } }, 0); return true; }; //订阅方法 q.subscribe = function (topic, func) { if (!topics[topic]) { topics[topic] = []; } var token = (++subUid).toString(); topics[topic].push({ token: token, func: func }); return token; }; //退订方法 q.unsubscribe = function (token) { for (var m in topics) { if (topics[m]) { for (var i = 0, j = topics[m].length; i < j; i++) { if (topics[m][i].token === token) { topics[m].splice(i, 1); return token; } } } } return false; };} (event));
//发布
event.publish('aaa',111);//订阅
event.subscribe('aaa', function (topics, data) { console.log(data);});
var Event = (function(){ var clientList = {}, listen, trigger, remove; listen = function( key, fn ){ if ( !clientList[ key ] ){ clientList[ key ] = []; } clientList[ key ].push( fn ); }; trigger = function(){ var key = Array.prototype.shift.call( arguments ), fns = clientList[ key ]; if ( !fns || fns.length === 0 ){ return false; } for( var i = 0, fn; fn = fns[ i++ ]; ){ fn.apply( this, arguments ); } }; remove = function( key, fn ){ var fns = clientList[ key ]; if ( !fns ){ return false; } if ( !fn ){ fns && ( fns.length = 0 ); }else{ for ( var l = fns.length - 1; l >=0; l-- ){ var _fn = fns[ l ]; if ( _fn === fn ){ fns.splice( l, 1 ); } } } }; return { listen: listen, trigger: trigger, remove: remove } })(); var a = (function(){ var count = 0; var button = document.getElementById( 'count' ); button.onclick = function(){ Event.trigger( 'add', count++ ); } })(); var b = (function(){ var div = document.getElementById( 'show' ); Event.listen( 'add', function( count ){ div.innerHTML = count; }); })();
阅读全文
0 0
- 设计模式学习(六)
- 设计模式学习(六)创建者模式
- 学习JavaScript设计模式(六)
- 设计模式(六)
- 设计模式学习笔记六(Prototype原型模式)
- 设计模式学习系列六:组合模式(composite)
- php设计模式学习系列(六)--建造者模式
- 设计模式学习笔记(六)建造者模式
- 设计模式学习(六):模版模式
- 设计模式学习(六) ------- 适配器与外观
- Java设计模式(六)
- [体系结构]设计模式(六)
- 设计模式(六)bridge
- java 学习笔记【六】设计模式
- 重读《设计模式》之学习笔记(六)--经典的23种设计模式
- 设计模式学习笔记六:原型设计模式
- 设计模式(六):Prototype模式
- 设计模式(六):Prototype模式
- 公有云和私有云的区别
- 快速集成一个视频直播功能
- 基于HTML5和WebGL的3D网络拓扑结构图
- CDH安装过程
- Python Logging模块的简单使用(转)
- 设计模式学习(六)
- iOS-检测设备的WiFi是否打开?
- openshift 学习笔记-5 template使用
- ubuntu下关于profile和bashrc中环境变量的理解
- FFmepg基本使用流程
- 3 disconf在springboot下动态配置各个属性,基于docker环境
- 安卓常用代码片段
- 湘潭大学-基于Dragonboard 410c的实时公交站牌系统设计(二)
- 【caffe跑试验遇到错误:Check failed: error == cudaSuccess (2 vs. 0) out of memory】