为什么我们需要观察者模式
本文关键字:观察者模式 我们 为什么 | 更新日期: 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 的实现,因为它需要了解新消息的构造方式。
但是,这只是描述正常的观察者模式实现。 正如您所说,也可能存在一些情况或变体,这些情况或变体可以使主题不依赖于消息。