发布订阅模式源码实现

Posted afterwawa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发布订阅模式源码实现相关的知识,希望对你有一定的参考价值。

var shoeObj = {}; // 定义发布者
shoeObj.list = []; // 缓存列表 存放订阅者回调函数
        
// 增加订阅者
shoeObj.listen = function(key,fn) {
    if(!this.list[key]) {
        // 如果还没有订阅过此类消息,给该类消息创建一个缓存列表
        this.list[key] = []; 
    }
    this.list[key].push(fn);  // 订阅消息添加到缓存列表
}

// 发布消息
shoeObj.trigger = function(){
    var key = Array.prototype.shift.call(arguments); // 取出消息类型名称
    var fns = this.list[key];  // 取出该消息对应的回调函数的集合

    // 如果没有订阅过该消息的话,则返回
    if(!fns || fns.length === 0) {
        return;
    }
    for(var i = 0,fn; fn = fns[i++]; ) {
        fn.apply(this,arguments); // arguments 是发布消息时附送的参数
    }
};

// 小红订阅如下消息
shoeObj.listen(red,function(size){
    console.log("尺码是:"+size);  
});

// 小花订阅如下消息
shoeObj.listen(block,function(size){
    console.log("再次打印尺码是:"+size); 
});
shoeObj.trigger("red",40);
shoeObj.trigger("block",42);

 

以上是关于发布订阅模式源码实现的主要内容,如果未能解决你的问题,请参考以下文章

EventBus发布-订阅模式 ( 使用代码实现发布-订阅模式 )

redis源码阅读-发布与订阅pub/sub

redis源码阅读-发布与订阅pub/sub

Spring源码之七registerListeners()及发布订阅模式

我在生产项目里是如何使用Redis发布订阅的?Java版代码实现(含源码)

EventBus发布-订阅模式 ( Android 中使用 发布-订阅模式 进行通信 )