发布者订阅模式
/*
分析
有一个对象,一旦有变化则通知订阅者
实例:买东西
如果去买东西没货,给店员留下有货联系方式,当货物到了,商家按照订阅者要求进行通知
属性:消息队列 {
click:[fn1,fn2],
trigger:[fn1,fn2,fn3]
}
*/
class Observer {
constructor() {
this.message = {};
}
/* 添加内容 */
on(type, fn) {
//判断是否存在
if(!this.message[type])
{
this.message[type]=[];
}
this.message[type].push(fn);
}
/* 删除内容 取消订阅 */
off(type, fn) {
//如果fn不存在
if(!fn)
{
delete this.message[type];
return
}
//如果类型不存在
if(!this.message[type])
return;
//重新赋值
this.message[type]=this.message[type].filter(item=>item!=fn);
}
/* 触发内容 */
trigger(type) {
if(this.message[type])
{
this.message[type].forEach(item => {
item();
});
}
}
}
const person1=new Observer();
person1.on('三国演义',handlerA)
person1.on('三国演义',handlerB)
person1.on('水浒传',handlerC)
person1.on('水浒传',handlerD)
// person1.off('三国演义');
person1.off('三国演义',handlerA)
person1.trigger('三国演义');
console.log(person1);
function handlerA(){
console.log('邮箱通知我--A');
}
function handlerB(){
console.log('短信通知我--B');
}
function handlerC(){
console.log('打电话告诉我--C');
}
function handlerD(){
console.log('微信告诉我--D');
}