迭代器模式
2021年10月27日大约 2 分钟约 550 字
1. 概念
迭代器模式提供一种方法顺序访问一个集合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式使得能够以不同的方式遍历一个集合对象,从而在同一个集合上可以有多个遍历,此外,在迭代器模式中,增加新的集合类和迭代器类都很方便,无须修改原有代码。但它的缺点是,由于迭代器模式将存储数据和遍历数据的职责分离,增加新的集合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
迭代器模式实际上在Java的集合类中已经广泛使用了。以List
为例,要遍历ArrayList
,即使我们知道它的内部存储了一个Object[]
数组,也不应该直接使用数组索引去遍历,因为这样需要了解集合内部的存储结构,而如果使用Iterator
遍历,那么,ArrayList
和LinkedList
都可以以一种统一的接口来遍历:
List<String> list = ...
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
}
2. 示例
我们将创建一个叙述导航方法的 Iterator
接口和一个返回迭代器的 Container
接口,实现了 Container
接口的实体类将负责实现 Iterator
接口。最后,客户端类 IteratorPatternDemo
使用实体类 NamesRepository
来打印 NamesRepository
中存储为集合的 Names
。

创建接口
public interface Iterator { public boolean hasNext(); public Object next(); }
public interface Container { public Iterator getIterator(); }
创建实现了
Container
接口的实体类。该类有实现了Iterator
接口的内部类NameIterator
public class NameRepository implements Container { public String[] names = {"Robert" , "John" ,"Julie" , "Lora"}; @Override public Iterator getIterator() { return new NameIterator(); } private class NameIterator implements Iterator { int index; @Override public boolean hasNext() { if(index < names.length){ return true; } return false; } @Override public Object next() { if(this.hasNext()){ return names[index++]; } return null; } } }
使用
NameRepository
来获取迭代器,并打印名字public class IteratorPatternDemo { public static void main(String[] args) { NameRepository namesRepository = new NameRepository(); for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){ String name = (String)iter.next(); System.out.println("Name : " + name); } } }
执行程序,输出结果: Name : Robert Name : John Name : Julie Name : Lora