迭代器模式
引言
迭代器模式是一种行为型设计模式,其核心思想是:为容器对象提供一种统一的方式来顺序访问其内部元素,而不暴露其内部实现。它将遍历行为从容器对象中抽离,提供灵活可扩展的访问机制,实现了**"访问机制与存储结构解耦"**的目标,是构建集合类系统的重要基础。
实际开发中的用途
迭代器模式几乎是集合处理的"标配"。无论是列表、集合、树结构还是分页数据,在不关心其底层结构的前提下进行统一遍历,都可以使用迭代器模式。常见的应用场景包括:数据分页加载、配置项扫描、DOM节点遍历、数据库游标、结果集解析等。它的最大价值在于:遍历方式可扩展、结构变化不影响调用者。
开发中的示例
以菜单系统为例,不同的菜单结构可能使用不同的数据结构(数组、List、Map),但我们希望前端可以统一遍历这些菜单项并渲染:
java
public interface MenuIterator {
boolean hasNext();
MenuItem next();
}
public interface Menu {
MenuIterator iterator();
}
不同菜单容器实现自己的 iterator()
方法即可,前端遍历时无需关心底层结构,只需处理 MenuItem
。
Spring源码中的应用
在 Spring 框架中,迭代器模式贯穿整个容器生命周期,常见场景包括:
BeanDefinition 遍历
java
ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName);
// 统一处理所有Bean定义
}
Spring 将 BeanDefinitionNames 暴露为 String[]
,但开发者通过 for-each 或 Stream 接口即可迭代使用,无需关注底层结构(LinkedHashMap)。
ApplicationEvent 多监听器分发
java
for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
listener.onApplicationEvent(event);
}
Spring 事件发布机制使用监听器集合统一遍历处理事件响应,是典型的迭代器模式应用。
BeanPostProcessor 链式处理
java
for (BeanPostProcessor processor : beanPostProcessors) {
bean = processor.postProcessBeforeInitialization(bean, beanName);
}
这段 Bean 初始化处理过程中,每个后处理器按顺序执行,同样体现了迭代器控制逻辑与处理解耦的优势。
Java案例
自定义一个"简单的整数集合"并用标准Java迭代器遍历
1. 先定义一个简单的集合类,支持迭代
java
import java.util.Iterator;
public class SimpleIntCollection implements Iterable<Integer> {
private final int[] data;
public SimpleIntCollection(int... values) {
this.data = values;
}
@Override
public Iterator<Integer> iterator() {
return new SimpleIntIterator();
}
// 内部类:自定义迭代器
private class SimpleIntIterator implements Iterator<Integer> {
private int index = 0;
@Override
public boolean hasNext() {
return index < data.length;
}
@Override
public Integer next() {
return data[index++];
}
}
}
2. 使用示例
java
public class Main {
public static void main(String[] args) {
SimpleIntCollection numbers = new SimpleIntCollection(1, 2, 3, 5, 8);
// 使用标准for-each遍历(底层其实就是在调用Iterator)
for (int num : numbers) {
System.out.println(num);
}
}
}
3. 运行结果
plaintext
1
2
3
5
8
4. 小总结
SimpleIntCollection
是一个自定义集合,实现了Iterable<Integer>
接口。iterator()
方法返回了一个自定义的SimpleIntIterator
对象。SimpleIntIterator
实现了标准Java的Iterator
接口,提供了hasNext()
和next()
方法。- 最后我们可以用Java标准for-each语法无感知地遍历它。
总结
迭代器模式是集合访问的"统一语言",通过封装访问逻辑,实现"使用者不关心结构、结构可自由扩展"的解耦模型。Spring 框架在 Bean 管理、事件发布、拦截器执行等多处都体现了该模式的精髓。理解迭代器模式,不只是学会写遍历方法,更是对"接口编程、行为抽象"的深度实践。
(对您有帮助 && 觉得我总结的还行) -> 受累点个免费的赞👍,谢谢