Design patterns 如果不理解观察者模式,解耦在哪里

Design patterns 如果不理解观察者模式,解耦在哪里,design-patterns,observer-pattern,Design Patterns,Observer Pattern,我正在阅读head-first设计模式,他们试图解释观察者模式。 如果我理解正确,这个模式的目的是将观察对象与数据本身分离 它是通过从IObserver继承并拥有一个“Update”方法来完成的,然后注册到某个接口,当某些内容发生更改时,该接口应该调用我的Update 但是在某些东西被改变之后,我仍然需要反对它自己来检查到底改变了什么,那么解耦在哪里呢 在我在书中的例子中,他们制作了几个不同的天气小部件,它们依赖于来自一堆传感器的数据。 他们试图将小部件与传感器分离,但正如您所看到的,每个小部件

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

它是通过从IObserver继承并拥有一个“Update”方法来完成的,然后注册到某个接口,当某些内容发生更改时,该接口应该调用我的Update

但是在某些东西被改变之后,我仍然需要反对它自己来检查到底改变了什么,那么解耦在哪里呢

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

我错过什么了吗


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

正如您可能看到的那样,解耦的意义在于您可以为您的库提供执行和处理事件的功能,并且您的库的用户可以为它们注册,您将调用它们的代码,可能不知道这些代码的功能


这一点现在更模糊了吗?

此设计模式通常用于注册事件,该事件的注册与事件本身无关,但必须与给定接口相适应,当事件发生时,通过调用
object.update()
来通知为该事件注册的观察者的每个实际实现

正如您可能看到的那样,解耦的意义在于您可以为您的库提供执行和处理事件的功能,并且您的库的用户可以为它们注册,您将调用它们的代码,可能不知道这些代码的功能


这一点现在更模糊了吗?

在你的书的例子中,观察者对象与主体对象有效地耦合在一起

这种方法的产生是因为观察者必须知道被摄体中存储的信息

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

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

更新(内部温度、内部湿度、内部压力)


在本书的示例中,观察者对象有效地与主体对象耦合

这种方法的产生是因为观察者必须知道被摄体中存储的信息

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

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

更新(内部温度、内部湿度、内部压力)


观察者模式将观察者与被观察对象解耦。它不会将观察者与观察产生的数据分离。

因此,在本次讨论中,多种类型的天气数据显示器(观察员)已与监测天气数据的仪器(主体)分离

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

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


希望这能澄清

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

因此,在本次讨论中,多种类型的天气数据显示器(观察员)已与监测天气数据的仪器(主体)分离

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

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

希望这能澄清