js 中发布与订阅者模式

发布与订阅者模式

之前在unity做游戏的时候,常常使用到,发布于订阅者模式。目的是为了解耦。不然代码太黏不易维护。

他的本质就是做到,发布者唯一的(key),但是订阅者多个(value)      是一个一对多的关系

具体的实现


let eventMap = new Map();
class Observe  { 
    /**
     * 发布信息 
     * @param {string} key key值
     * @param  {...any} args key之外的所有参数
     */
    emit(key,...args){ 
        if(!eventMap.has(key)){
            console.warn(`并无关键字${key},请仔细检查`);
            return
        }
        let eventArray = eventMap.get(key) 
        console.log('eventArray:',eventArray)
        eventArray.forEach(event => {
            //执行订阅的方法 并将参数传入 
            event(...args); 
        });
 
    }
    /**
     * 收集订阅 与订阅对应的方法   可以一个关键字对应多个方法
     * @param {string} key 订阅的关键字
     * @param {function} event  关键字对应的方法
     */
    addEvent(key,event){
        // if(eventMap.has(key)){
        //     throw Error(`您定义的关键字${key},请更换为其他关键字`);
        // } 
        if(typeof key !='string'){
            throw Error(`您定义key为${typeof key}类型,请更改为string`);
        }
        if(typeof event !='function'){
            throw Error(`您定义event为${typeof event}类型,请更改为function`);
        }
        let eventArray = [];
        if(eventMap.has(key)){
            eventArray = eventMap.get(key) 
        } 
        eventArray.push(event)  
        eventMap.set(key, eventArray);  
    } 
}
//单例
let instance=null;
//创建一个单例
function getInstance(){
    if(instance === null){
        instance = new Observe();
    }
    return instance;
} 
export default getInstance();


//实例
//improt Observe from "../Observe" 这个 导出的时候注意 
//同一个关键字可以订阅多个方法
// 事件的订阅1   
// Observe.addEvent('play',function(info){
//     console.log('1:',info)
// })
// 事件的订阅2
// Observe.addEvent('play',function(info){
//     console.log('2:',info)
// })

// 事件的分发  {a:1},'hello world' 为参数 可以传 可不传
// Observe.emit('play',{a:1},'hello world');

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值