为什么我们需要观察者模式?

时间:2012-04-26 10:14:32

标签: c# java design-patterns observer-pattern

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

班级clock,方法time()

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

应用程序想要在12AM到达时发送消息。

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

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

5 个答案:

答案 0 :(得分:3)

用简单的词语,让你理解Observer pattern

如果有1000人订阅每日新闻报道。

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

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

答案 1 :(得分:1)

因为作为观察者的新新类只调用时钟实例中的subscribe方法,当时钟到达12AM时,它将调用notifyObservers方法,这将迭代通过订阅者并调用他们的notify方法告诉他们现在是12AM。

他们会以自己的方式对每个人做出反应,通过向用户显示消息或响铃或其他任何方式,你不必改变时钟实现中的任何内容。

答案 2 :(得分:0)

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

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

但是,这仅描述了正常的观察者模式实现。正如你所说,可能会出现一些情况或变体,主体不依赖于消息。

答案 3 :(得分:0)

本质是:

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

将Observer模式与OO理论继承和多态相结合,您将看到您的代码将是多么灵活。

答案 4 :(得分:0)

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