概述
迭代器模式是一种行为设计模式,它提供了一种访问集合对象元素的方式,而无需暴露集合的内部结构。这种模式支持以统一的方式遍历不同类型的集合,使得集合的使用者不需要关心集合的具体实现,从而提高了代码的灵活性和可重用性。
目的
分离集合的遍历操作:将集合的遍历逻辑从集合本身中分离出来,使得集合的定义、实现和遍历可以独立变化。
提供统一的遍历接口:无论集合内部结构如何,都通过一个统一的接口来遍历,简化了客户端代码。
支持多种遍历方式:迭代器模式允许为同一个集合提供多种遍历方式。
角色
Iterable(集合):定义创建迭代器的接口。
Iterator(迭代器):实现了遍历集合中元素的方法,如
hasNext()
检查是否还有下一个元素,next()
获取下一个元素。Concrete Iterable(具体集合):实现Iterable接口,负责创建并返回一个具体的迭代器实例。
Concrete Iterator(具体迭代器):实现Iterator接口,完成对具体集合的遍历操作。
适用场景
当你需要为聚合对象提供多种遍历方式时。
需要对聚合对象进行遍历,但不希望暴露其内部表示时。
集合类的内部结构可能会变化,但又不希望影响到使用该集合的客户端代码时。
优点
封装性好:隐藏了集合内部的细节,只暴露迭代接口。
灵活性高:可以轻松添加新的迭代器来支持新的遍历方式,而无需修改集合类。
易于使用:为遍历不同类型的集合提供了统一的接口。
缺点
增加复杂性:引入了额外的类和接口,对于简单的遍历需求可能会显得过度设计。
性能开销:相比于直接遍历数组或列表,使用迭代器可能有轻微的性能损失。
代码示例
Iterable 接口
public interface Iterable<T> {
Iterator<T> iterator();
}
Iterator 接口
public interface Iterator<T> {
boolean hasNext();
T next();
}
Concrete Iterable(具体集合)
public class ArrayList<T> implements Iterable<T> {
private T[ ] elements;
// 省略其他方法...
@Override
public Iterator<T> iterator() {
return new ArrayListIterator<>(this);
}
// 具体迭代器内部类
private static class ArrayListIterator<T> implements Iterator<T> {
// 实现 hasNext 和 next 方法...
}
}
使用示例
ArrayList<String> names = new ArrayList<>();
// 假设已经添加了一些元素
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
总结
迭代器模式是一种非常实用的设计模式,它通过定义迭代接口和具体迭代器类,使得客户端能够以一种统一且高效的方式遍历集合,同时保持了集合内部结构的封装性和灵活性。在需要对集合进行复杂遍历操作或者需要支持多种遍历方式的场景下,迭代器模式是不可或缺的设计工具。
评论区