1. 发布订阅模式和观察者模式很相似,但并不等同
发布订阅模式是一种消息范式,消息发送者(发布者)不会将消息直接发送给特定的接受者(订阅者),而是将发布的消息分为不同的类别,通过一个中间的消息代理来调度消息,发布者无需了解有哪些订阅者存在。同样的,订阅者也只接受自己感兴趣的那一类消息,无需了解发布者是否存在。 发布者和订阅者都不知道彼此的存在,是完全的松耦合。
发布者(publishers)的消息不会直接发送给特定的接收者(订阅者)。
观察者模式中观察者和被观察是知道彼此的存在的,被观察者一直保持着对所有观察者的记录,被观察者发送通知消息时也是调用观察者的更新方法。因此“观察者”和“被观察者”是相互依赖的。
两者比较如下:
总结一下二者的主要区别:
(1)观察者模式的被观察者和观察者之间是有依赖的,是紧耦合;发布-订阅模式的发布者和订阅者无直接依赖,通过消息代理进行通信,是松耦合的;
(2)观察者模式大多是同步的,而发布订阅模式大多是异步的;
(3)观察者模式需要在单个应用程序地址空间中实现,发布订阅是交叉应用模式
2. 发布-订阅模式具体实现
和观察者模式有些相似,只是把订阅者列表的维护和新消息通知的实现移到了消息管理器(就是发布者和订阅者中间的消息代理)中了。
有个写得不错的博客: java实现发布订阅