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

本文关键字:观察者模式 我们 为什么 | 更新日期: 2023-09-27 18:32:15

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

clock ,带有方法 time()

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

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

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

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

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

简单来说,让你理解观察者模式

如果订阅了

1000人订阅每日新闻报纸。

每当有新副本到达时,出版商都会向其订阅者发送一份副本,即每天。

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

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

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

本质是:

观察

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

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

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

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

在观察者模式中,"观察对象"(主体)将保留对观察者的引用,主体通常负责构造要发送给观察者的"消息"。 这意味着,如果您需要通知观察者新消息,则需要更改 Subject 的实现,因为它需要了解新消息的构造方式。

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