JS设计模式之发布订阅(PublishSubscribe)模式

更新时间:2023-07-25 04:04:22 阅读: 评论:0

JS设计模式之发布订阅(PublishSubscribe)模式
简介
发布订阅模式定义了⼀种⼀对多的依赖关系,让多个订阅者对象同时监听某⼀个主题对象。这个主题对象在⾃⾝状态变化时,会通知所有订阅者对象,使它们能够⾃动更新⾃⼰的状态。
合理的的使⽤订阅者模式,可以减少程序之间的耦合,但是会增加内存和时间的开销。
应⽤
平时开发中,我们可能会经常遇到下⾯的情况:
expedialoadImage(imgAry, function () {
Map.init();
Gamer.init();
美国之声voa
})
复制代码
上⾯代码是⼀个图⽚加载器,在图⽚加载完成之后渲染地图, 执⾏游戏逻辑,⼤部分时候我们也会这么写。但有有⼀天,我们需要在游戏⾥⾯添加背景⾳乐,于是我们在Gamer.init();后⾯添加了⼀句Sount.init();。表⾯上看起来没什么问题,但是可能会给我带来很多预想不到的结果,因为我们改变了loadImage的结构。
为了解决这种问题,我们可以把代码结构调整为下⾯这样:。
loadImage.listen("ready", function () {
Map.init();
})
loadImage.listen("ready", function () {
Gamer.init();
})
loadImage.listen("ready", function () {
Sount.init();
})
复制代码
这样loadImage只负责载⼊图⽚,⽽不需要做其他的操作了,然后在图⽚载⼊成功之后,只需要通告⼀下,表⽰图⽚载⼊成功了,⾄于成功之后要做什么操作,loadImage⽆需关⼼。
复制代码
代码
function  pubsub  (myObject) {
var topics = {};
var subUid = -1;
牛奶歌下载//  发布  (标题参数)
freddie macmyObject.publish = function( topic, args ) {
myObject.publish = function( topic, args ) {
//只在topic的时候继续,不存在的时候返回fal
if ( !topics[topic] ) {
cricket
return fal;
}
//该事件的订阅者数组
var subscribers = topics[topic];
//数组长度
var len = subscribers ? subscribers.length : 0;
//调⽤每个通知者的函数,并且传参数
while (len--) {
wait的过去式subscribers[len].func( topic, args );
}
return this;
};
//添加订阅
myObject.subscribe = function( topic, func ) {
//没有订阅者的时候,初始化这个订阅者数组denmark怎么读
if (!topics[topic]) {
topics[topic] = [];
}
/
/给每个订阅者添加⼀个token
var token = ( ++subUid ).toString();
//放进队列
topics[topic].push({
token: token,
func: func
});
//返回token
return token;
};
//取消订阅2012考研英语
myObject.unsubscribe = function( token ) {
//根据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 this;
};
}
复制代码
案例
//接上上⾯的代码
var obj = {};
pubsub(obj)            //对obj对象进⾏加⼯
amidst//回调函数
function func1 (topic,args){
console.log('这是',topic,'事件,参数为:',args)
}
var token1=obj.subscribe ('test1', func1)  //创建⼀个,并且保存token
var token2=obj.subscribe ('test2', ()=>{
console.log('test2')
})  //创建⼀个,并且保存token
//输出:
//这是 test1 事件,参数为:测试下
//test2
复制代码
总结

本文发布于:2023-07-25 04:04:22,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/187957.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:ezpublish基础
标签:订阅   对象   时候
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图