前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂。以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长。为了培养编程思维,决定从设计模式开始写起。我是通过读《Javascript设计模式与开发实践》来学习设计模式,并且将知识点和收获记录在博客中。
此文仅记录本人阅读《JavaScript设计模式与开发实践》的知识点与想法,感谢作者曾探大大写出这么好的一本书。如有冒犯,请联系本人:markcoder@outlook.com处理,请大家购买正版书籍。
1.发布-订阅模式介绍
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状 态发生改变时,所有依赖于它的对象都将得到通知。2.代码实现
const Event = {
clientList: {},
// 绑定事件监听
listen(key, fn){
if(! this.clientList[key]){
this.clientList[key] = [];
}
this.clientList[key].push(fn);
return true;
},
// 触发对应事件
trigger(){
const key = Array.prototype.shift.apply(arguments),
fns = this.clientList[key];
if(!fns || fns.length === 0){
return false;
}
for(let fn of fns){
fn.apply(null, arguments);
}
return true;
},
// 移除相关事件
remove(key, fn){
let fns = this.clientList[key];
// 如果之前没有绑定事件
// 或者没有指明要移除的事件
// 直接返回
if(!fns || !fn){
return false;
}
// 反向遍历移除置指定事件函数
for(let l = fns.length - 1; l >= 0; l--){
let _fn = fns[l];
if(_fn === fn){
fns.splice(l, 1);
}
}
return true;
}
}
// 为对象动态安装 发布-订阅 功能
const installEvent = (obj) => {
for(let key in Event){
obj[key] = Event[key];
}
}
let salesOffices = {};
installEvent(salesOffices);
// 绑定自定义事件和回调函数
salesOffices.listen("event01", fn1 = (price) => {
console.log("Price is", price, "at event01");
})
salesOffices.listen("event02", fn2 = (price) => {
console.log("Price is", price, "at event02");
})
salesOffices.trigger("event01", 1000);
salesOffices.trigger("event02", 2000);
salesOffices.remove("event01", fn1);
// 输出: false
// 说明删除成功
console.log(salesOffices.trigger("event01", 1000));