3

我读了一本关于观察者模式的书。它给出了以下示例:

clock,带方法time()

Class message,其中 3 个类继承自它:Fax, Mail, Memo.

应用程序希望在上午 12 点到达时发送消息。

本书推荐观察者模式。它说如果我们添加新的类:VideoMsg扩展消息,它会影响类时钟的实现。但我不明白为什么。时钟类将保存message' 对象的集合,如果我们添加一个新的继承类,它不会改变时钟类。

如果有人能解释上面的例子,或者给出一个更好的例子,我将不胜感激。

4

5 回答 5

3

用简单的话,让你理解观察者模式

如果有 1000 人订阅了一份日报。

每当有新副本到达时,即每天,发布者都会向其订阅者发送副本。

同样的方式一个类将在获得新信息时向其观察者发送信息。

于 2012-04-26T10:38:18.903 回答
1

因为新的新类,即观察者,只会调用subscribe时钟实例中的方法,当时钟到达 12AM 时,它会调用该notifyObservers方法,该方法将遍历订阅者并调用他们的notify方法,告诉他们现在是 12AM .

他们将以自己的方式对此做出反应,通过向用户显示消息或响铃或其他方式,您无需更改时钟实现中的任何内容。

于 2012-04-26T10:26:39.907 回答
0

老实说,很难给出答案,因为示例中没有太多的实现细节。

在观察者模式中,“被观察对象”(Subject)将持有对观察者的引用,而主题通常负责构造“消息”发送给观察者。这意味着,如果您需要通知 Observers 有新消息,则需要更改 Subject 的实现,因为它需要知道新消息是如何构造的。

但是,这仅描述了正常的观察者模式实现。正如您所说,也有可能使主题不依赖于消息的情况或变体。

于 2012-04-26T10:23:32.527 回答
0

本质是:

被观察者不需要持有观察者的引用,只需要提供一个处理程序来描述被通知时的行为。

将观察者模式与 OO 理论继承和多态结合起来,您将看到您的代码将变得多么灵活。

于 2012-04-26T10:45:44.030 回答
0

除了缺少细节之外,我猜“消息”会观察时钟对象以按时触发“动作”。取决于“如何”(观察)?这是实施它可能意味着改变时钟是必要的。观察者模式是“我们叫你——不要叫我们”的模式。它基本上可以防止昂贵的忙等待循环。

于 2012-04-26T11:07:57.953 回答