首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未能理解观察者模式,解耦在哪里?

未能理解观察者模式,解耦在哪里?
EN

Stack Overflow用户
提问于 2013-07-02 18:52:02
回答 3查看 858关注 0票数 0

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

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

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

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

我是不是漏掉了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-03 14:41:06

观察者模式将观察者与被观察者解耦。它不会将观察者与由于观察而生成的数据解耦。

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

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

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

希望这能澄清!

票数 3
EN

Stack Overflow用户

发布于 2013-07-03 09:14:03

在您的书的示例中,观察者对象实际上与Subject对象耦合在一起。

耦合是因为观察者必须知道存储在对象中的信息的事实。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-07-02 19:03:38

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

正如你可能看到的,解耦是在这样的意义上,你可以给你的库来做和处理事件,你的库的用户可以注册它们,你将调用他们的代码,可能不知道代码做了什么。

这是不是现在更模糊了?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17423669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档