Spring + 设计模式 (十七) 行为型 - 迭代器模式

迭代器模式

引言

迭代器模式是一种行为型设计模式,其核心思想是:为容器对象提供一种统一的方式来顺序访问其内部元素,而不暴露其内部实现。它将遍历行为从容器对象中抽离,提供灵活可扩展的访问机制,实现了**"访问机制与存储结构解耦"**的目标,是构建集合类系统的重要基础。

实际开发中的用途

迭代器模式几乎是集合处理的"标配"。无论是列表、集合、树结构还是分页数据,在不关心其底层结构的前提下进行统一遍历,都可以使用迭代器模式。常见的应用场景包括:数据分页加载、配置项扫描、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 管理、事件发布、拦截器执行等多处都体现了该模式的精髓。理解迭代器模式,不只是学会写遍历方法,更是对"接口编程、行为抽象"的深度实践。

(对您有帮助 && 觉得我总结的还行) -> 受累点个免费的赞👍,谢谢

相关推荐
00后程序员1 小时前
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
后端
HyggeBest1 小时前
Mysql的数据存储结构
后端·架构
TobyMint2 小时前
golang 实现雪花算法
后端
G探险者2 小时前
【案例解析】一次 TIME_WAIT 导致 TPS 断崖式下降的排查与优化
后端
码农之王2 小时前
(一)TypeScript概述和环境搭建
前端·后端·typescript
玛奇玛丶2 小时前
面试官:千万级订单表新增字段怎么弄?
后端·mysql
木木一直在哭泣2 小时前
基于 XXL-JOB 的任务调度封装实践:xxl-job-start 项目详解
后端
掘金狂热勇士2 小时前
Bullet 物理引擎:开启逼真物理模拟的大门
后端
扎瓦2 小时前
ThreadLocal 线程变量
java·后端
涡能增压发动积3 小时前
一起来学 Langgraph [第一节]
后端