javaScript ES6 ObServer观察者模式实现
观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。
观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。
观察者模式在多人开发中有很多用处,通过定义事件类型来分配各自需要完成的模块
// 用闭包返回一个私有变量class
const ObServer = (() => {
// WeakMap 的key可以是一个对象 优先使用
const __messages = new WeakMap();
class ObServer {
constructor() {
// 存储观察者对象
__messages.set(this, {});
}
regist(type, fn) {
// 获取观察者对象
let messages = __messages.get(this);
if(!messages[type]) {
messages[type] = [fn] // 如果没有改属性 默认放到数组里面
} else {
messages[type].push(fn) // 存在的话 推送到队列
}
}
fire(type, args = {}) {
let messages = __messages.get(this);
if(!messages[type]) return;
let params = {
type,
args
}
messages[type].forEach(item => item.call(this, params)) // 循环消息队列 依次执行
}
remove(type, fn) {
let messages = __messages.get(this);
if(messages[type] instanceof Array){
var i = messages[type].length - 1;
for (; i >= 0; i--) {
messages[type][i] === fn && messages[type].splice(i, 1) // 删除队列里方法
}
}
}
}
return ObServer;
})();
let obServer = new ObServer();
// 订阅信息
obServer.regist('test', function(e) {
console.log(e)
})
// 订阅信息
obServer.regist('test', function(e) {
console.log(e)
})
// 发布一条信息
obServer.fire('test', {
msg: '这是一条测试信息'
})