此题是在一次头条面试中被问到的,网上关于Vue双向绑定原理解释的有很多,说是【发布-订阅】的有;说是【观察者】的也有。
其实是哪种模式并没有那么重要,但真的遇到"较真的"面试官,还是要好好应对一下的。
Vue使用的是观察者模式
发布订阅模式是一种解耦的设计模式,发布者与订阅者没有直接的接触,中间有一层"经纪人"。
而Vue中,每个数据为了做依赖收集将每个数据设定了一个Watcher
对象,即没有中间层。
此外,严格的发布订阅模式下,发布者只管发布给"经纪人",订阅者去"经纪人"那里去订阅自己关心的消息(这个很像Kafka),所以发布订阅模式中会存在一个消息队列。Vue中并没有这个消息队列。
- 观察者模式里,只有两个角色 —— 观察者 + 被观察者
- 而发布订阅模式里,却不仅仅只有发布者和订阅者两个角色,还有一个经常被我们忽略的 —— 经纪人Broker
- 观察者和被观察者,是松耦合的关系
- 发布者和订阅者,则完全不存在耦合
- 观察者模式,多用于单个应用内部
- 发布订阅模式,则更多的是一种跨应用的模式(cross-application pattern),比如我们常用的消息中间件