Java和.Net编程环境中非常常用的设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示,迭代器模式属于行为模式。
核心角色
角色 |
描述 |
Iterator |
定义遍历集合的接口,如hasNext()、next() 等方法。 |
ConcreteIterator |
实现具体的遍历逻辑。 |
Aggregate |
聚合类接口,定义创建迭代器的方法iterator() 。 |
ConcreteAggregate |
具体聚合类,返回一个与该聚合结构匹配的迭代器。 |
示例代码
该模式常常用于Collection包中,譬如List
、Set
等实现了Iterator
接口对其统一了行为并可以使用for/while增强。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| public interface Iterator<T> { boolean hasNext(); T next(); }
public class ListIterator<T> implements Iterator<T> { private T[] items; private int position = 0;
public ListIterator(T[] items) { this.items = items; }
@Override public boolean hasNext() { return position < items.length; }
@Override public T next() { return items[position++]; } }
public interface Aggregate<T> { Iterator<T> iterator(); }
public class ListAggregate<T> implements Aggregate<T> { private T[] items;
public ListAggregate(T[] items) { this.items = items; }
@Override public Iterator<T> iterator() { return new ListIterator<>(items); } }
public class Client { public static void main(String[] args) { String[] data = {"A", "B", "C"}; Aggregate<String> aggregate = new ListAggregate<>(data); Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
|
特点与应用场景
-
优点
- 解耦集合与遍历逻辑: 客户端不需要关心具体结构即可遍历。
- 统一接口访问
- 支持多种遍历方式: 排序、过滤filter、reduce、map、flatmap…
-
缺点
- 增加类的数量,系统复杂度有所增加。一般由语言本身迭代维护,譬如JDK 1.5 扩展了Iterator、JDK 8增加了Stream等等。