发布订阅模式

© Young 2016-08-04 11:55
Welcome to My GitHub

定义

发布订阅模式又被称为观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。

发布订阅模式一般分为推模式和拉模式两种,推模式是指事件发生时,发布者一次性把所有更改的状态和数据都推送给订阅者;拉模式是指发布者仅仅通知订阅者事件已经发生了,此外发布者要提供一些公开的接口来主动拉取数据。

拉模式的好处是可以让订阅者按需获取,但同时有可能让发布者变成一个门户大开的对象,同时增加了代码量和复杂度。

类图

发布订阅模式所涉及的角色有:

  • 抽象主题(Subject)

抽象主题(Subject)把所有观察者保存在一个集合里,每个主题都可以有任何数量的观察者;抽象主题提供一个接口,可以增加和删除观察者,抽象主题(Subject)又叫做抽象被观察者(Observable)。

  • 具体主题(ConcreteSubject)

在具体主题的内部状态改变时,给所有登记过的观察者发出通知;具体主题又叫做具体被观察者(Concrete Observable)。

  • 抽象观察者(Observer)

为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。

  • 具体观察者(ConcreteObserver)

存储与主题的状态自恰的状态;具体观察者实现抽象观察者所要求的更新接口,以便使本身的状态与主题的状态协调。

实现

优点

发布订阅模式可以取代对象之间的硬编码的通知机制,一个对象不用再显示地调用另一个对象的某个接口,发布订阅模式让两个对象松耦合地联系在一起;但有新的订阅者出现时,发布者的代码不需要任何修改,同样发布者需要改变时,也不会影响到之前的订阅者。

缺点

创建订阅者要消耗一定的时间和内存,比如当对象订阅一个消息后,如果这个消息最后都未发生,那么这个订阅者会一直存在于内存中;

另外发布订阅模式虽然可以弱化对象之间的联系,但如果过度使用的话,对象和对象之间的必要联系也将被深埋在背后,会导致程序难以跟踪维护和理解,特别是有多个发布者和订阅者嵌套到一起的时候,要跟踪一个bug不是件轻松的事情。

应用

  • 发布订阅模式广泛应用于异步编程中,可以用来替换传统的回调函数。

  • DOM事件

  • 自定义事件

发表评论

电子邮件地址不会被公开。 必填项已用*标注