为什么观察者模式看起来更像是“通知模式”?

时间:2009-06-09 01:49:23

标签: design-patterns

观察者模式看起来非常像通知模式,因为它基于主题通知感兴趣的对象。 “通知”部分似乎是最重要的部分,因为没有它,就不会收到任何通知。

(有没有想过将这种模式重命名为通告模式?)

那里是否存在更多“基于观察者”的观察者模式?

例如,有一个定时器,以便观察者每隔n毫秒观察被观察的物体。

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

2 个答案:

答案 0 :(得分:5)

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

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

这不是第一次模式错误命名。控制反转声音真的很复杂,直到你意识到所有真正意味着通过将它们分配给构造函数中的参数来为类提供所需的对象(依赖)。 “依赖注入”一词的创造是为了使这个概念更加清晰。

答案 1 :(得分:0)

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

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

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

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