0

我正在阅读 head first 设计模式,他们试图解释观察者模式。如果我理解正确,这种模式的目的是将观察对象与数据本身分离。

它是通过从 IObserver 继承并具有“更新”方法来完成的,然后注册到某个接口,当某些东西发生变化时应该调用我的更新。

但是在某些事情发生变化之后,我仍然需要反对自己来检查到底发生了什么变化,那么解耦在哪里呢?

在我在书中的示例中,他们正在制作几个不同的天气小部件,这些小部件依赖于来自一堆传感器的数据。他们试图将小部件与传感器分离,但正如您所见,它们有一个从每个小部件直接指向传感器数据的直接指针(它写在页面底部),所以实际上根本没有解耦.

我错过了什么吗?

在此处输入图像描述

4

3 回答 3

3

观察者模式将观察者与被观察者分离。它不会将观察者与观察生成的数据分离。

因此,在本次讨论的情况下,天气数据的多种显示(观察者)已与监测天气数据的仪器(主题)分离。

为了验证这种解耦是否真实,您需要问一个问题:“如果我必须再添加一个观察者,我需要更改多少个类才能添加新的观察者?” - 在这种情况下,答案为零,因为您只是添加了一个新的观察者类,它将向主题注册自己。并且在“主题”或其余“观察者”中不会有单行代码更改。

观察者设计模式,在某种程度上,可以帮助你实现开闭原则(OCP)。根据这个原则,一个类应该是“开放扩展”但“关闭修改”。

希望这可以澄清!

于 2013-07-03T06:41:06.070 回答
1

在您书中的示例中,观察者对象与主题对象有效地耦合在一起。

耦合源于观察者必须知道存储在主题中的信息这一事实。

但是,这种模式可以以不同的方式实现,因此可以避免这种耦合。最简单的方法是在您调用通知观察者某些已更改的方法时将信息作为参数传递。(这称为“推送”数据)

根据您的示例,该方法的签名可能是:

更新(int温度,int湿度,int压力)

于 2013-07-03T01:14:03.283 回答
0

这种设计模式通常用于注册事件,该事件的注册内容独立于事件本身,但必须遵守给定的接口,当事件发生时,为该事件注册的观察者的每个实际实现都会得到通知通过调用object.update().

正如您可能看到的那样,解耦是指您可以为您的库提供执行和处理事件,并且您的库的用户可以注册它们,您将调用他们的代码,可能不知道该代码的作用。

现在是不是更模糊了?

于 2013-07-02T11:03:37.870 回答