发布订阅与观察者

发布订阅模式与观察者模式

  发布订阅模式与观察者模式是两个及其容易弄混淆的设计模式,二者虽然在使用场景上有相似之处,但是在实现的调度方式上有不同之处。

发布订阅模式

  我们首先介绍下发布订阅模式。根据维基百科上的定义,发布订阅模式是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

  上面的定义可能把大家看的云里雾里的,这里我们举一个简单的例子。大家在买二手房的时候都会通过中介找房子,买家会给中介留下联系方式,以便在有合适的房子的时候中介能够及时通知他们。当有卖家出售房子时也会告知中介,自己要卖房子,这时中介就会根据买家留的信息挨个打电话通知买家有合适的卖家在卖房子。这里买家就是订阅者,卖家就是发布者。而中介扮演了调度中心的角色(这也是和观察者模式的一个最主要的区别)。从这个例子我们可以看到,发布者和订阅者时完全解耦的,中间通过调度中心进行注册和事件触发通知。

观察者模式

  维基百科的定义如下,观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

   还是通过上述二手房买卖的例子来举例,买家就是观察者,卖家就是被观察者,买家直接给卖家留下自己的联系方式,当卖家打算出售自己的房子时,通过买家留下的联系方式逐个进行通知。

两者的区别

  通过上述两个例子的讲解我们应该很清楚观察者模式和发布订阅模式的区别了。这两者的主要区别就在于调度中心(也就是例子中的中介)的有无,在发布订阅模式中,连着时通过调度中心联系在一起的,双方都不知道对方的存在。而在观察者模式中,观察者在被观察者中注册,当被观察者发生变动时通知观察者。