迭代器模式:实现集合遍历的设计方案
迭代器模式概述
迭代器模式是一种行为型设计模式,它提供了一种顺序访问集合对象中各个元素的方法,而无需暴露集合对象的底层实现结构。在Java等面向对象编程语言中,迭代器模式被广泛应用于集合框架的实现中。
迭代器模式的核心思想是将集合的遍历操作与集合本身分离,使得同一个集合可以被多种不同的方式进行遍历。这种模式使得集合类的使用更加灵活,同时也符合单一职责原则。
迭代器与增强for循环
在Java中,增强for循环(for-each循环)的底层实现正是基于迭代器模式。当我们使用增强for循环遍历集合时,编译器会自动将其转换为使用迭代器的代码。
例如,下面的代码:
List<String> names = Arrays.asList("张三", "李四", "王五");
for (String name : names) {
System.out.println(name);
}
在编译后,实际上会被转换为:
List<String> names = Arrays.asList("张三", "李四", "王五");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
从转换后的代码可以看出,增强for循环本质上是通过迭代器来实现的。迭代器就像一个指向集合元素的指针,通过不断移动这个指针来依次访问集合中的每个元素。
迭代器模式的实现
下面,我们将实现一个自定义的迭代器模式。我们将创建一个自定义的集合类,并为其实现迭代器功能。
1. 定义自定义集合类
/**
* 自定义集合类
* 实现Iterable接口表示此类支持迭代操作
*/
public class CustomCollection<E> implements Iterable<E> {
// 使用数组存储元素
private final E[] elements;
// 私有构造器
private CustomCollection(E[] elements) {
this.elements = elements;
}
// 工厂方法创建实例
public static <E> CustomCollection<E> create(E[] elements) {
return new CustomCollection<>(elements);
}
// 实现iterator方法,返回迭代器
@Override
public Iterator<E> iterator() {
return new CustomIterator();
}
// 自定义迭代器实现
private class CustomIterator implements Iterator<E> {
// 当前迭代位置
private int position = 0;
// 判断是否有下一个元素
@Override
public boolean hasNext() {
return position < elements.length;
}
// 获取下一个元素并移动指针
@Override
public E next() {
if (!hasNext()) {
throw new NoSuchElementException("没有更多元素了");
}
return elements[position++];
}
}
}
2. 使用自定义迭代器
// 创建数组
Integer[] numbers = {1, 2, 3, 4, 5};
// 使用自定义集合类处理数组
CustomCollection<Integer> collection = CustomCollection.create(numbers);
// 使用增强for循环遍历,底层会调用迭代器
for (Integer num : collection) {
System.out.println(num);
}
编译后的代码实际上会转换为:
// 创建数组
Integer[] numbers = {1, 2, 3, 4, 5};
// 使用自定义集合类处理数组
CustomCollection<Integer> collection = CustomCollection.create(numbers);
// 获取迭代器
Iterator<Integer> iterator = collection.iterator();
// 使用迭代器遍历
while (iterator.hasNext()) {
Integer num = iterator.next();
System.out.println(num);
}
输出结果为:
1
2
3
4
5
迭代器模式的优缺点
优点
- 支持以多种不同方式遍历同一个聚合对象。
- 简化了聚合类的实现,将遍历逻辑分离到迭代器中。
- 可以在同一个聚合对象上同时进行多个遍历操作。
- 符合开闭原则,增加新的聚合类和迭代器类时无需修改原有代码。
缺点
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要同时增加对应的迭代器类,这会导致系统中类的数量增加,增加系统复杂度。
- 对于简单的聚合结构,使用迭代器模式可能会显得过于复杂。
迭代器模式的使用场景
- 当需要访问一个聚合对象的内容,而不希望暴露其内部表示时。
- 当需要为聚合对象提供多种不同的遍历方式时。
- 当需要为不同类型的聚合结构提供统一的遍历接口时。
- 当希望在同一个聚合对象上进行多个遍历操作时。