发布与订阅者模式
之前在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');