首页 > 解决方案 > 迭代器模式可能存在缺陷?

问题描述

考虑以下 UML 图: 迭代器模式图像

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

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

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

标签: oopdesign-patterns

解决方案


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

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

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

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


推荐阅读