设计模式——发布订阅模式

196 阅读1分钟
  1. 定义

也称作观察者模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发 生改变时,所有依赖于它的对象都将得到通知

  1. 核心

取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口。

与传统的发布-订阅模式实现方式(将订阅者自身当成引用传入发布者)不同,在JS中通常使用注册回调函数的形式来订阅

  1. 实现

JS中的事件就是经典的发布-订阅模式的实现

// 订阅
document.body.addEventListener('click', function() {
    console.log('click1');
}, false);

document.body.addEventListener('click', function() {
    console.log('click2');
}, false);

// 发布
document.body.click(); // click1  click2

下面自己实现一个简单的发布订阅模式

// 观察者
var observer={
    subscribes:[],//订阅者集合
    // 订阅
    subscribe:function(fn){
        this.subscribes.push(fn)
    },
    // 发布
    public(){
        this.subscribes.forEach(item=>{
            item.apply(this,arguments)
        })
    },
    // q取消订阅
    remove(fn){
        for(let i=0,len=this.subscribes.length;i<len;i++){
            if(fn===this.subscribes[i]){
                this.subscribes.splice(i,1)
            }
        }
    }
}

let subscriber1=function(){
console.log("订阅对象1");
}
let subscriber2=function(){
console.log("订阅对象2");
}
let subscriber3=function(){
console.log("订阅对象3");
}
observer.subscribe(subscriber1)
observer.subscribe(subscriber2)
observer.subscribe(subscriber3)
setTimeout(() => {
    observer.public();
}, 1000);
observer.remove(subscriber2)
//最终隔了一分钟输出
//订阅对象1
//订阅对象3
  1. 优缺点

优点

一为时间上的解耦,二为对象之间的解耦。可以用在异步编程中与MV*框架中

缺点

创建订阅者本身要消耗一定的时间和内存,订阅的处理函数不一定会被执行,驻留内存有性能开销

弱化了对象之间的联系,复杂的情况下可能会导致程序难以跟踪维护和理解