游标vs迭代器模式

Cursor vs Iterator pattern

本文关键字:模式 迭代器 vs 游标      更新时间:2023-10-16

在许多文本中,我看到术语游标与术语迭代器交替使用。然而,把它们当作同样的东西来对待似乎是不对的。

对我来说,迭代器允许在不知道容器本身的情况下迭代容器。另一方面,游标也允许容器的迭代,但具有特定于容器类型的实现细节,因此它保留了对容器的引用。此外,游标的接口反映了容器的接口,有点像facade模式。

这里有一个我认为是游标的例子:

class Book {};
class Library
{
    std::vector<Book> books;
    bool IsBookHardCover( int bookIndex );
    bool IsBookSoftCover( int bookIndex );
    BookCursor GetFirstBook();
};
class BookCursor
{
    std::vector<Book>& books;
    int currentBook;
    bool IsHardCover();
    bool IsSoftCover();
    void Next();
};

所以基本上我区分迭代器和游标是基于它们对迭代容器的依赖或了解。这是一个恰当的区分吗?如果没有,您会考虑我在上面的代码示例中概述的设计模式吗?

请注意,我上面的代码示例应该被视为伪代码,因为我没有编译它,而且它也缺乏所需的构造函数。

您描述的游标模式是两个模式的组合:Proxy和Iterator。标准库不同的原因是为了避免不必要地耦合这两种行为。

Wikipedia将Cursor Pattern重定向到Iterator Pattern页面。考虑到这一点,我觉得你是在小题大做。如果我们认为维基百科是一个权威的参考,这两个术语可以互换使用。

在使用设计模式这个术语之前的很长一段时间里,由于允许更大的扩展来修改底层数据结构,所以光标比迭代器更强大。如insertBefore(), insertAfter()或insertAt()等。一些实现允许多个指针在同一个容器上操作,并且它们相互通知操作(它们在我们的时代被称为稳定迭代器,或稳定数据结构)

迭代器(至少c++标准中定义的方式)不允许访问底层容器的属性,但可以通过不同的迭代器类别(可以通过iterator_tags访问)访问这些细节。

我也认为你的例子有缺陷。当我可以访问包含的值并查询其属性时,为什么数据集合会镜像数据的接口(例如IsHardCover()) ?