发布订阅思想(观察者模式)

发布订阅的思想在很多场景里会用到,也是用的最多,大家喜欢用的思想。举以下几个例子:

  1. Dom的事件线程订阅了很多事件,当有用户触发,就会调用对应的事件callback,callback就会被加入到js的事件循环里。btn.onClick = function(){}, function就相当于发布者,onclick就是订阅者。
  2. Promise的then和resolve,then就相当于订阅者,resove就是发布者。
  3. 还有redux里面的state,dispatch,页面mapStateToRedux就是订阅,dispatch就是发布。
  4. ......

咱们使用发布订阅模式来模拟一下简单的发布订阅模型。

const SubPubCenter = {
    clients: [],
    subscribe: function (key, fn) {
        this.clients.push({ key, fn })
    },
    publish: function (msg) {
        this.clients.forEach(item => {
            const { key, fn } = item;
                fn.call(this, key, msg)
            }
        )
    }
}

SubPubCenter.subscribe('张三', function (key, msg) {
    console.log(`${key} receive ${msg}`)
})

SubPubCenter.subscribe('李四', function (key, msg) {
    console.log(`${key} receive ${msg}`)
})

SubPubCenter.publish("你好");

// 张三 receive 你好
// 李四 receive 你好