【问题标题】:How come the Observer Pattern look more like a "Notifier Pattern"?为什么观察者模式看起来更像“通知者模式”?
【发布时间】:2009-06-09 01:49:23
【问题描述】:

观察者模式看起来很像通知者模式,因为它基于主题通知感兴趣的对象。 “通知”部分似乎是最重要的,因为没有它,什么都不会得到通知。

(有没有想过将此模式重命名为通知者模式?)

有没有更“基于观察者”的观察者模式?

例如,有一个计时器,以便观察者每隔 n 毫秒查看被观察的对象。

或者一个(就像在机器代码中一样),当一个例程想要观察一个内存位置时,它会调用某个例程并说:“如果内存位置 TEMPERATURE_VALUE(例如,0x32FF2C12)被修改,然后打电话给我(它知道该值被硬件中断机制修改)。这种情况下,主体不通知或无法决定是否通知,而是被强制观察。

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    观察者模式之所以如此命名,是因为附属于主体对象的对象“观察”其行为。这种观察(从主体向观察者推送信息)的机制是由主体对象发起的,不会改变观察者对象的固有功能(即观察)。

    这种模式可以更好地描述为“订阅者模式”,因为观察者对象“订阅”主题对象上的事件,然后“监听”这些事件。准确地说,观察者对象不直接观察主体对象,而是通过主体对象触发订阅事件而提供给它的信息间接地观察主体对象。

    模式被错误命名已经不是第一次了。控制反转听起来很复杂,直到您意识到真正的意思是通过将所需的对象(依赖项)分配给构造函数中的参数来为类提供所需的对象(依赖项)。术语“依赖注入”是为了使这个概念更清晰而创造的。

    【讨论】:

    • 全部正确。观察者经常被称为发布/订阅(Pub/Sub)(虽然不完全准确),而在 Java 中订阅者是 ActionListeners 和 EventListeners。所以所有这些名字都是在野外“观察到”的...... :)(无法抗拒)
    • 虽然 IoC 不是最直观的名称,但它很好地描述了该模式的作用:)
    • 顺便说一句,我认为有些书说观察者模式与发布/订阅模式相同,而有些书说观察者模式是一对多,而发布/订阅模式是多对-一对多
    【解决方案2】:

    在对该模式了解更多后,我认为这就是它被称为“观察者模式”的原因:

    1) 任何方法都可以“通知”。数据对象(主体)可以通知 3 个硬编码对象,它们充当观察者。或者数据对象可以通过“注册”观察者的动态数组并通知他们中的每一个。关键不在于通知。关键是注册。

    2) 我们不想对 3 个观察对象进行硬编码,因为这是紧耦合,因此会减少对象重用。如果我们允许“观察者注册”,那么2个对象可以注册然后观察主体,或者3个对象可以注册并观察主体,或者任意数量的对象可以注册并观察主体。

    3) 因此,“观察者注册”是该模式的关键思想。所以它可以被称为“观察者注册模式”,或者简称为“观察者模式”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 2021-05-08
      • 2016-02-20
      • 2023-04-10
      相关资源
      最近更新 更多