有好多人一提到发布、订阅模式就头大,不了解的人就会想,他是干什么的啊 和观察者模式有什么区别呢
其实发布订阅模式和观察者模式的区别还是很大的,订阅发布模式比观察者模式多一个调度的部分
虽然两种模式都存在订阅者和发布者(具体观察者可认为是订阅者、具体目标可认为是发布者),但是观察者模式是由具体目标调度的,而发布/订阅模式是统一由调度中心调的,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会。
在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。说到发布订阅模式,因为是一对一或者一对多的关系,具体实现其实就是把你想要发布的东西,存到一个对象或者数组当中,用的时候直接去遍历调用
代码如下:
function pubSub() { var topics = {}; function subScribe(topic, fn) { if (!topics[topic]) { topics[topic] = []; } //并未去重,如果去重的话不能使用解构赋值,因为[...new Set(arr)]这种方式只能去重基本数值类型,fn是函数引用类型 topics[topic].push(fn); } function publish(topic, ...args) { // console.log(topics[topic].length) if (!topics[topic]) return; // 迭代相同topic值对应的函数 for (let fn of topics[topic]) { fn(...args) } } return { subScribe, publish } } var pubSub1 = new pubSub(); pubSub1.subScribe('add', function (a, b) { console.log(a + b) }) pubSub1.subScribe('minus', function (a, b) { console.log(a - b) })
看完这个是不是感觉发布订阅模式很简单呢