大家好,在本文中,我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式,但是也许您没有意识到它是模式,或者不知道它的巨大价值。 根据《 Head First Design 》一书:
迭代器模式提供了一种在不暴露其底层表示的情况下顺序访问聚合对象的元素的方法。
哇啊? 好吧,它表示无论您使用什么数据结构(数组,列表,哈希表等),如果实现此模式,都可以以相同的方式遍历它。 它为您提供了一种访问数据结构(聚合)元素的统一方法,但您不必知道哪种数据结构 您正在遍历...很好! 同样,它在Iterator对象上而不是在数据结构上设置迭代的责任,从而简化了数据结构中的编码。 让我们检查一下Iterator模式的经典类图:
Iterator Pattern的实际类图进行了一些更改,特别是在Iterator类(接口)中,现在我们将在稍后看到不同的方法,但是首先让我们回顾一下以前的每个类(或接口) ):
- Aggregate :这是我们数据结构的基类(或接口),您可以将其视为java.util.Collection接口,它为集合类定义了许多方法。
- ConcreteAggregate :这是我们将要迭代的具体数据结构,例如java.util.ArrayList , java.util.Vector等。
- 迭代器 : 迭代器的基类(或接口)。 您可以通过java.util.Iterator在Java 中找到一个。 您会注意到Java版本有不同的方法,我们将在本文后面讨论。 在这里,您定义了遍历数据结构所需的de方法。
- ConcreteIterator :当您要遍历不同的数据结构时,需要不同的迭代器。 因此,concreteIterator是要遍历的数据结构的Iterator。
现在,让我们看一下Iterator Pattern的Java实现。 下图是使用Architexa的免费代码理解工具生成的 ,它显示了Java Collections Framework的某些类之间的关系,在这里我们可以看到类似于经典类图的结构:
上图仅显示了Java模式的一种实现,还有很多,但它们始终使用java.util.Iterator接口; 这是在用Java进行编码时应在Iterator Pattern的实现中使用的接口。 让我们比较两个图:
您在JavaDocs中看不到此类,但在源代码中有该类:java.util.Itr
请注意,Java示例中Iterator对象的方法与经典类图中的方法不同:
- 没有+ First()方法。 如果需要转到第一个元素,则必须实例化一个新的迭代器。
- + IsDone()方法已重命名为+ hasNext()。
- + Next()和+ CurrentItem()已合并到+ next()中。
- + remove()方法已添加。
因此,如果您不得不使用不同的数据结构,并且需要一种统一的方式遍历它们和/或访问它们的项,请考虑一下迭代器模式:
//... in a class/*** Traverse a list, hashtable, vector, etc. what ever that implements* the Iterator Pattern*/public void traverse(Iterator iter){while(iter.hasNext()){System.out.println(iter.next());}}
当然,您始终必须为数据结构创建ConcreteIterator类,但是如果您使用的是
Java Collections Framework ,它已经完成。
最后一件事,请记住最重要的OO原则: 始终使用满足您需求的最简单解决方案,即使它不包含pattern 。
资源:
Freeman Eric和Freeman Elisabeth以及Sierra Kathy和Bates Bert(2004)。 头先设计模式 。 美利坚合众国:O'Reilly Media,Inc.
参考:来自Java和ME博客的JCG合作伙伴 Alexis Lopez的Iterator Pattern和Java 。
翻译自: https://www.javacodegeeks.com/2013/01/iterator-pattern-and-java.html