我们都知道的 观察员的模式:你有一个问题,它能够通知和更新清单的观察员对其状态的变化。现在假设这个问题你会喜欢观察是一个容器里,并且你想要遵守的容器本身,即元件外,并删除的元素,并且也包含的元素,即状态的更新容器的要素。

你将如何执行的更新机制,以便快速关于元件插入或删除当你存储大量的对象,在你的容器?特别是,

  • 你会用相同的容器类型的地方复制的观察员?
  • 是有一个明智的选择的容器,其观察员就应该使用?(例如,将它以更快的速度来说,始终使用均衡树,甚至如果你观察一个链接清单?)
  • 你怎么迅速翻译一个迭代进入观察到容器进入一个迭代进入观察员的容器?(琐碎阵列,难相联系的名单?)

如果你的容器,是一个链表例如,然后你可以插入元素在不断的时间。如果m观察员迭代的清单,载列的n元素,然后更新的需要O(n*m)预期的时间。

如果你的容器阵列,然后改变元素所用的时间是固定的,并更新m观察员需要O(m)如果通过件的索引,O(n*m)如果观察员迭代过阵列。

如果有帮助,考虑以下例子:

例1。你正在写一个操作系统。这问题你会喜欢观察是文件系统和文件。你的意见是一个文件管理、电器和其他应用程序。你想要更新的观察员在文件添加、删除或修改。

例2。你所写的地址簿的应用程序,它应能够处理一个城市的大小,纽约。这问题你会喜欢观察是容器的记录(一个人与其地址、电话号码、电子邮件...).你的观察员几个景观,它应该更新时,自动添加、删除或修改记录。(一可能像一种看法包含一系列的人生活在第53次和另一个绘制点,在地图上的每个人的最后名称是Doe)。

你怎么处理的情况,完整目录-树被删除或者说,"第53St"更名为"Dijkstra St"?

有帮助吗?

解决方案

不知怎的,你必须打开容器进入一个主题。

这里的主要问题是找到一个有效的方式,通知的变化。大部分时间当你遇到这个问题,它的 你的东西要观察不能提供一个有效的通知机制(可能是因为观察员的设计图案,不是当他们发明了事情就是写入)。

[编辑]由于你问的有效方法,一般的回答是"它取决于"。设计模式没有一个"一刀切"的解决方案。他们是一般规则如何处理一个问题。如何你需要实施的规则在特定情况下是什么,你解决当你在的情况。

一般来说,如果你观察员需要确定微小变化(即一个属性变更或添加一个元素),通知信息应包含足够的信息,他们可以做这样有效。所以如果你有一个很大的清单以及插入、发送列表和索引的新的元素加上"的项目作为插入".

作为对属性的变化,有两个解决方案。一种是以增加观察员中的每一个元素名单。这可以是缓慢和需要很大的RAM,但它意味着你可以添加若干类型的入同一清单。

或者,你可以有一个"修改项目的列表服务"。这意味着禁止将改变的项目直接,必须总是使用该服务。该服务可以作为一个受和发送通知,与该项目,旧和改变价值及可能与本索引列表。

[EDIT2]的一般规则是,以收集尽可能多的信息有关的变化并尽可能通过的观察员。但这真的取决于你的具体问题。让我们说观察员坐在一个遥控的机器。在这种情况下,没有有效的方式发送的整个名单。你只能把它发送"的项目X插入",并希望这就够了。如果容器没有办法通知的变化(例如,新的网页,在网站),容器已经穿越整个网站的一次又一次找到变化,它随后可以告诉观察员以有效的方式。

再次,详细情况真的取决于具体情况。谷歌运行千网蜘蛛其访问数以百万计的网页,每隔一小时。很长一段时间,这是"有效的"(如在"唯一的办法").前一段时间,"地图"的协议是实现其允许管理员把自己的网站进入的主题可以告诉谷歌观察员有关的变化。

所以除非你可以得到更具体的例子你需要做什么,我不能给你一个更具体的回答。与设计方案,有一点,你需要坐下来,采取一个真正的问题并打开你的大脑。

[EDIT3]这里有几个例子使用的观察员的模式:

  • 许多UI框架使用这一模式传播活动向感兴趣的缔约方。在脱,你有一个中央地点的所有科目可以注册他们的信号,(通知他们会送)和观察员可以连接到的主题。这意味着有一个单一地点的所有连接的管理。优点是,你不需要添加这样的数据结构到每一个对象。此外,对象是从外界(非夸脱对象)可以发送和接收信息。因为一切都是在一个单一的地方,这种数据结构可以优化容易。其缺点是,这种结构可以成为非常大,因此发送的信息将需要更多的时间当有更多缔约方参与(甚至那些完全无关的).

  • 谷歌使用的地图的协议,把网站进入的主题,因为这是高效得多穿越整个网站的一次又一次,甚至如果你只请求的最后修改的时间的一个网址(HTTP头,而不是HTTP得到)。

  • 文件系统,在Windows和Linux提供通知,告诉应用程序有关的新的或删除的文件。这里的主要问题是应该发生什么文件时更改,同时应用程序不运行。说你有一个应用程序,维护校验的文件目录。很显然,你想知道关于改变当的程序,但这将意味着通知服务将有跟踪最后更改发送。因此,在这里,应用程序已经阅读整个树在启动时看到任何它可能已经错过了它需要使用观察员模式的变化发生的同时,它的运行。

  • 邮件的客户是一个观察员。它会告诉我的邮件服务器的ID的最后一个电子邮件它已经看到服务器将告诉它关于任何新的问题。

  • 当你有很多的属性的变化在一个复杂的模型,通常是唯一的方式集中所有变化(使它们运行通过一个单一的地点),并附有观察员(而不是附加N观察员M个人对象)。在本执行情况,观察员可以说"我感兴趣的任何变化的任何地方"或"一个变化的领域X在任何问题"或"任何变化,在受Y"(最后一个通常是兼作"改变的领域X在受Y"-观察员将简单地忽略变化领域的!= X)。

其他提示

为什么不观察员模式本身?

该问题需要通知观察员有关的有趣的活动。然后,观察员应派遣它向感兴趣的缔约方(用户).

本质问题是没有任何意义在这里。(除非我理解你的问题是错误的).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top