我读了一本关于观察者模式的书。它给出了以下示例:
班级clock
,方法time()
类message
,其中3个类继承自它:Fax, Mail, Memo
。
应用程序想要在12AM到达时发送消息。
本书推荐观察者模式。它说如果我们添加新类:VideoMsg
扩展消息,它将影响类Clock的实现。但我不明白为什么。类Clock将保存message
对象的集合,如果我们将添加一个新的继承类,它将不会更改时钟类。
如果有人会解释上面的例子,或者给出一个更好的例子,我将不胜感激。
答案 0 :(得分:3)
用简单的词语,让你理解Observer pattern
如果有1000人订阅每日新闻报道。
每当新副本到达时,发布者都会向其订阅者发送副本,即每天。
同样的方法一个类在获得新信息时会向其观察者发送信息。
答案 1 :(得分:1)
因为作为观察者的新新类只调用时钟实例中的subscribe
方法,当时钟到达12AM时,它将调用notifyObservers
方法,这将迭代通过订阅者并调用他们的notify
方法告诉他们现在是12AM。
他们会以自己的方式对每个人做出反应,通过向用户显示消息或响铃或其他任何方式,你不必改变时钟实现中的任何内容。
答案 2 :(得分:0)
老实说,很难给出答案,因为示例中没有太多的实现细节。
在观察者模式中,“观察对象”(主题)将持有对观察者的引用,而主体通常负责构建要发送给观察者的“消息”。这意味着,如果您需要通知Observers一条新消息,则需要更改Subject的实现,因为它需要知道新消息的构造方式。
但是,这仅描述了正常的观察者模式实现。正如你所说,可能会出现一些情况或变体,主体不依赖于消息。
答案 3 :(得分:0)
本质是:
观察者不需要持有观察者的引用,只需提供一个处理程序来描述通知时的行为。
将Observer模式与OO理论继承和多态相结合,您将看到您的代码将是多么灵活。
答案 4 :(得分:0)
除了缺少细节之外,我猜测'消息'会观察时钟对象以按时触发'动作'。取决于'如何'(观察)?这是实现它可能意味着需要更改时钟。 观察者模式是'我们称呼你 - 不要叫我们'模式。它基本上可以防止昂贵的繁忙等待循环。