我试图将观察者设计模式理解为主要的事件调度设计模式。观察者模式似乎是发布-订阅设计模式的类型或种类,我想知道为什么有两种外观相似的设计模式以及我应该如何在两者之间进行选择。
在这两种情况下,信息消息都在实体之间发送,并且在这两种情况下,实体都必须以某种方式注册或订阅才能接收消息。
两种设计模式之间的主要区别似乎是:
- 观察者模式的消息量似乎较少。观察者向他们正在观察的实体注册,以便收到某个事件的通知。发布-订阅模式似乎涉及一种单向对话,一种从一个实体到另一个实体的独白,其中包含大量更多不同类型的消息。
- 在观察者模式中,观察者期望一种特定类型的事件通知,其中发布-订阅似乎具有更开放的消息协议,具有更广泛的可能消息类型和消息内容(由特定类型的事件触发的消息之间的差异指示事件发生与更通用的消息协议相比,消息包含可能不是事件触发器的信息,例如包含由周期性计时器触发的温度数据的消息)。
- 观察者是在应用程序的边界内或在单个进程内实现的。Publish-Subscribe 是一种跨应用程序通信模式,消息在不同进程之间交换。
- Publish-Subscribe 具有独立的发布者、代理和订阅者实体,而 Observer 使用组合的发布者/代理和订阅者(观察者)实体,存在架构差异。
想到的一个想法是,在多线程应用程序中,在多个线程之间进行通信时可能会使用发布-订阅模式,而不是观察者模式。也许观察者模式可以在进程之间使用,例如一个进程向另一个进程注册,以便在事件发生时得到通知。一个例子是一个农场管理仪表板应用程序,该应用程序向多个动物饲料箱注册,如果该箱测量的饲料水平或重量低于某个阈值,则会收到通知。
这两种设计模式之间是否还有其他重要差异,可以提供选择其中一种的标准?