本文共 1470 字,大约阅读时间需要 4 分钟。
迭代器模式是现在使用非常广泛的一种模式,Java、C#等很多语言都是用迭代器创建集合,然后提供for-each
语法糖让我们能够方便的遍历集合。如果对Java或C#等语言的集合比较熟悉的话,那么迭代器模式你也一定很熟悉。
首先我们来编写迭代器的接口。该接口有两个方法,next()和hasNext(),用于判断是否存在下一个值并获取当前值。
public interface Iterator { boolean hasNext(); int next();}
为了配套,一般情况下还有另外一个接口Iterable
,集合类一般需要实现该接口表示可以从集合类上获取迭代器。
public interface Iterable { Iterator getIterator();}
然后我们来编写一个自定义集合和该集合的迭代器。注意,迭代器的起始索引应该设置为第一个元素的前一个,这样才能让第一次调用next()获取第一个元素。
public class MyCollection implements Iterable { private int[] array; public MyCollection(int[] array) { this.array = array; } @Override public Iterator getIterator() { return new MyCollectionIterator(array); }}class MyCollectionIterator implements Iterator { private int[] array; private int current; public MyCollectionIterator(int[] array) { this.array = array; current = -1; } @Override public boolean hasNext() { return current <= array.length - 2; } @Override public int next() { return array[++current]; }}
最后我们来看看运行结果。不出意外的话整个集合都会正确遍历。
public void run() { int[] array = {1, 2, 3, 4, 5, 6}; MyCollection myCollection = new MyCollection(array); Iterator iterator = myCollection.getIterator(); while (iterator.hasNext()) { System.out.printf("%d ", iterator.next()); } System.out.println(); }
让我们最后再回想一下迭代器使用的现成例子:Java的集合类大多数都实现了迭代器模式;JDBC的结果集也实现了迭代器模式;旧的Java的Enumeration
也是一个实现了迭代器的例子。还有很多,这里就不一一列举了。
转载地址:http://ggbeo.baihongyu.com/