文章目录
- 1. 引言:为什么我们每天都在用迭代器?
- 2. 什么是迭代器模式
- GoF 定义
- 3. 迭代器模式的核心思想
- 4. 迭代器模式的结构
- 5. 示例:自定义集合 + 迭代器
- 5.1 迭代器接口
- 5.2 聚合接口
- 5.3 具体聚合类
- 5.4 客户端使用
- 6. 迭代器模式的优点
- 7. 迭代器模式的缺点
- 8. 内部迭代 vs 外部迭代
- 外部迭代(传统 Iterator)
- 内部迭代(Stream)
- 9. JDK 中的迭代器模式
- Iterator 接口
- 10. 适用场景
- 11. 一个常见误区
- 12. 迭代器 vs 访问者
- 参考
1. 引言:为什么我们每天都在用迭代器?
你在 Java 中几乎每天都会写:
for(Strings:list){System.out.println(s);}或者:
Iterator<String>it=list.iterator();while(it.hasNext()){System.out.println(it.next());}但你是否想过:
ArrayList和HashSet底层结构完全不同- 为什么遍历方式却是统一的?
答案就是:迭代器模式。
在不暴露集合内部结构的前提下,顺序访问集合元素
2. 什么是迭代器模式
GoF 定义
提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。
详细解释:迭代器模式提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
一句话理解:
遍历与集合实现解耦。
3. 迭代器模式的核心思想
迭代器模式解决了三个问题:
- 如何遍历集合
- 不暴露集合内部结构
- 提供统一遍历接口
集合负责存储,迭代器负责遍历。
4. 迭代器模式的结构
迭代器模式包含四个角色:
- Iterator(迭代器接口)
定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法。
- ConcreteIterator(具体迭代器)
实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
- Aggregate(聚合接口)
定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
- ConcreteAggregate(具体聚合)
实现抽象聚合类,返回一个具体迭代器的实例。
5. 示例:自定义集合 + 迭代器
5.1 迭代器接口
publicinterfaceIterator<E>{booleanhasNext();Enext();}5.2 聚合接口
publicinterfaceContainer<E>{Iterator<E>iterator();}5.3 具体聚合类
publicclassNameRepositoryimplementsContainer<String>{privateString[]names={"Alice","Bob","Charlie"};@OverridepublicIterator<String>iterator(){returnnewNameIterator();}privateclassNameIteratorimplementsIterator<String>{privateintindex;@OverridepublicbooleanhasNext(){returnindex<names.length;}@OverridepublicStringnext(){returnnames[index++];}}}5.4 客户端使用
NameRepositoryrepo=newNameRepository();Iterator<String>it=repo.iterator();while(it.hasNext()){System.out.println(it.next());}6. 迭代器模式的优点
- 隐藏集合内部结构
- 遍历方式统一
- 支持多种遍历策略
- 符合单一职责原则
7. 迭代器模式的缺点
- 增加类数量
- 对简单集合可能显得冗余
8. 内部迭代 vs 外部迭代
外部迭代(传统 Iterator)
while(it.hasNext()){process(it.next());}内部迭代(Stream)
list.stream().forEach(this::process);对比:
| 方式 | 控制权 |
|---|---|
| 外部迭代 | 调用者 |
| 内部迭代 | 集合 |
9. JDK 中的迭代器模式
Iterator 接口
publicinterfaceIterator<E>{booleanhasNext();Enext();}- ArrayList
- HashSet
- LinkedList
都通过 Iterator 统一遍历。
10. 适用场景
- 不同集合统一遍历
- 隐藏复杂数据结构
- 提供多种遍历策略
11. 一个常见误区
迭代器模式不是 for 循环的替代,而是“遍历规则的抽象”。
12. 迭代器 vs 访问者
| 模式 | 关注点 |
|---|---|
| 迭代器 | 如何遍历 |
| 访问者 | 如何操作 |
参考
迭代器模式 | 菜鸟教程
《图解设计模式》
迭代器 - Java教程 - 廖雪峰的官方网站
迭代器设计模式