比如你打开你的微信订阅号,你订阅的作者发布的文章,会广播给每个订阅者

    • 在这个场景里,微信公众号就是一个Pulisher
    • 而你就是一个Subscriber
    • 你收到的文章就是一个Message

    h9z5g64im6.png
    你可以让发布者发布消息、订阅者接受消息,而不是寻找一种方式把两个分离的系统连接在一起。
    当然这种松耦合也是发布/订阅者模式最大的缺点

    • 因为需要中间的代理,增加了系统的复杂度
    • 而且发布者无法实时知道发布的消息是否被每个订阅者接收到了,增加了系统的不确定性

    发布/订阅者模式与观察者模式是我们经常混淆的两种设计模式

    • 可以说两种设计模式在行为上有一定的相似性,但却是两种不同的设计模式
    • 或者说发布/订阅者模式是观察者模式的一种变体

    d3r5o2ne1l.png
    不同点

    1. 在观察者模式中,主体维护观察者列表,因此主体知道当状态发生变化时如何通知观察者。然而,在发布者/订阅者中,发布者和订阅者不需要相互了解。它们只需在中间层消息代理(或消息队列)的帮助下进行通信。
    2. 在发布者/订阅者模式中,组件与观察者模式完全分离。在观察者模式中,主题和观察者松散耦合。
    3. 观察者模式主要是以同步方式实现的,即当发生某些事件时,主题调用其所有观察者的适当方法。发布服务器/订阅服务器模式主要以异步方式实现(使用消息队列)。
    4. 发布者/订阅者模式更像是一种跨应用程序模式。发布服务器和订阅服务器可以驻留在两个不同的应用程序中。它们中的每一个都通过消息代理或消息队列进行通信