如果主题是一个巨大的容器,你如何有效地实现观察者模式?

时间:2009-06-05 10:08:32

标签: design-patterns scalability containers observers

我们都知道observer pattern:你有一个主题能够通知和更新其状态变化的观察者列表。现在假设您要观察的主题是一个容器,并且您希望观察容器本身,即元素的元素添加和删除,以及包含的元素,即容器元素的状态更新。

如何在容器中存储大量对象时,如何实现更新机制以便快速进行元素插入和删除?特别是,

  • 您会在观察员的本地副本中使用相同类型的容器吗?
  • 观察者应该使用容器的明智选择吗? (例如,即使您正在观察链表,它会更快,比如总是使用平衡树吗?)
  • 如何快速将迭代器转换为观察容器到观察者容器中的迭代器? (对于数组来说是微不足道的,对链表很难?)

如果您的容器是一个链接列表,那么您可以在常量时间插入元素。如果m个观察者必须遍历包含n个元素的列表,那么更新需要O(n * m)个预期时间。

如果你的容器是一个数组,那么更改一个元素需要一个恒定的时间,如果传递元素的索引,则更新m个观察者需要O(m),如果观察者必须迭代数组,则需要O(n * m)。 / p>

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

示例1.您正在编写操作系统。您要观察的主题是文件系统及其文件。您的视图是文件资源管理器,索引器和其他应用程序。您希望在添加,删除或修改文件时更新观察者。

示例2.您正在编写一个地址簿应用程序,该应用程序应该能够处理纽约大小的城市。您要观察的主题是您的记录容器(一个人的地址,电话号码,电子邮件......)。您的观察者有几个视图,在添加,删除或修改记录时应自动更新。 (人们可以想象一个视图,其中包含居住在第53位的人员列表以及地图上为姓氏为Doe的每个人绘制的另一个点。)

如何处理删除完整目录子树或将“53rd St”重命名为“Dijkstra St”的情况?

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

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

受试者需要告知观察者有趣的事件。然后观察员应将其发送给感兴趣的各方(订户)。

这个主题的性质没有任何意义。 (除非我理解你的问题不对。)