Appearance
JavaScript 中的发布订阅模式
这里要提出的是,我们一直讨论的发布—订阅模式,跟一些别的语言(比如 Java)中的实现 还是有区别的。在 Java 中实现一个自己的发布—订阅模式,通常会把订阅者对象自身当成引用传 入发布者对象中,同时订阅者对象还需提供一个名为诸如 update 的方法,供发布者对象在适合的 时候调用。而在 JavaScript 中,我们用注册回调函数的形式来代替传统的发布—订阅模式,显得更 加优雅和简单。
另外,在 JavaScript 中,我们无需去选择使用推模型还是拉模型。推模型是指在事件发生时, 发布者一次性把所有更改的状态和数据都推送给订阅者。拉模型不同的地方是,发布者仅仅通知 订阅者事件已经发生了,此外发布者要提供一些公开的接口供订阅者来主动拉取数据。拉模型的 好处是可以让订阅者“按需获取”,但同时有可能让发布者变成一个“门户大开”的对象,同时 增加了代码量和复杂度。
刚好在 JavaScript 中,arguments 可以很方便地表示参数列表,所以我们一般都会选择推模型, 使用 Function.prototype.apply 方法把所有参数都推送给订阅者。