迭代器模式中可能存在的缺陷?

问题描述

考虑以下 UML 图: Iterator Pattern Image

如果我们在 Facebook 类中添加一个 addFriend() 方法来将新朋友添加到个人资料中,新朋友不会反映在 Facebook Iterator 中,即使 Facebook Iterator 中有轮询方法来检查是否有新朋友已添加,这将是一个频率问题,并且总是存在新添加的朋友没有反映的极端情况。

我想我们可以在这里使用观察者模式,但在某种程度上,这意味着迭代器模式必须始终与观察者模式结合使用。

我想知道是否有人认为这是一个合法的问题,以及有人会如何解决这个问题

解决方法

您的评估很到位。并发修改是迭代器中的一个重要问题。 GoF 的书在第 261 页提到了它。

迭代器有多健壮?在遍历聚合时修改聚合可能很危险。如果从聚合中添加或删除元素,您最终可能会访问一个元素两次或完全丢失它。一个简单的解决方案是复制聚合并遍历副本,但通常这样做成本太高。

健壮的迭代器 确保插入和删除不会干扰遍历,并且不会复制聚合。有很多方法可以实现健壮的迭代器。大多数依赖于向聚合注册迭代器。在插入或移除时,聚合要么调整它生成的迭代器的内部状态,要么在内部维护信息以确保正确遍历。

这听起来确实像观察者模式是一种选择。 GoF 的书继续引用了几篇研究论文,这些论文显然对这个问题进行了更深入的研究。