发布订阅设计模式-2-单例设计模式
原创
©著作权归作者所有:来自51CTO博客作者wg_iGBFcBFB的原创作品,请联系作者获取转载授权,否则将追究法律责任
/***
*
* 发布订阅设计模式
* 发布一个计划,并且向计划中订阅一个个的方法
* 当触发某天事件或者到达了某个阶段,可以通知计划中订阅的方法,按照顺序依次执行
*
*/
// 第二版: 支持自定义事件,且一个页面只有一个事件池 [单例设计模式]
let sub = (function(){
// 创建自定义事件池
let pond = {};
// 订阅 / 移除订阅模式 / 通知执行
// 添加
const on = function on(event,func){
!pond.hasOwnProperty(event) ? pond[event] = [] : null;
let arr = pond[event];
// 去重处理
!arr.includes(func) ? arr.push(func) : null;
}
// 移除
const off = function off(event,func){
let arr = pond[event];
if(!arr) return ;
for(let i = 0; i < arr.length; i++){
if(arr[i] === func){
// 会导致数组塌陷, 带来一些无法控制的问题
// arr.splice(i,1);
arr[i] = null;
break;
}
}
}
// 执行
const fire = function fire(event,...params){
let arr = pond[event];
if(!arr) return ;
for(let i=0;i<arr.length;i++){
let itemFunc = arr[i];
if(typeof itemFunc !== "function"){
// 移除 null
arr.splice(i,1);
i--;
continue;
}
itemFunc(...params);
}
console.log(pond);
}
return {
on,
off,
fire
}
})();
// 测试
const fn1 = (x,y)=>{
console.log('fn1',x,y);
}
const fn2 = ()=>{
console.log('fn2');
sub.off('bodyClick',fn1);
sub.off('bodyClick',fn2);
}
const fn3 = ()=>{
console.log('fn3');
}
const fn4 = ()=>{
console.log('fn4');
}
const fn5 = (x,y)=>{
console.log('fn5',x,y);
}
document.body.onclick = function () {
// 通知事件池的方法执行
sub.fire('bodyClick',10,20);
}
// ;(()=>{
// function sum(){
// console.log('sum');
// }
// sub.on(sum);
// })();
sub.on('bodyClick',fn1);
sub.on('bodyClick',fn2);
sub.on('bodyClick',fn3);
sub.on('bodyClick',fn4);
sub.on('bodyClick',fn5);
// ---
setTimeout(()=>{
sub.fire('AAA',100,200);
},1000);
sub.on('AAA',fn1);
sub.on('AAA',fn3);
上一篇:抽象类
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
设计模式系列:单例模式
设计模式系列 单例模式
线程安全 单例模式 实例化 设计模式 -
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
一、发布-订阅模式、二、代码实现发布-订阅模式、1、订阅者接口、2、订阅者实现类、3、发布者、4、调度中心、5、客户端、
java EventBus 发布-订阅模式 原力计划 客户端