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 管理、事件发布、拦截器执行等多处都体现了该模式的精髓。理解迭代器模式,不只是学会写遍历方法,更是对"接口编程、行为抽象"的深度实践。

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

相关推荐
电商api接口开发30 分钟前
ASP.NET MVC 入门指南三
后端·asp.net·mvc
声声codeGrandMaster31 分钟前
django之账号管理功能
数据库·后端·python·django
我的golang之路果然有问题1 小时前
案例速成GO+redis 个人笔记
经验分享·redis·笔记·后端·学习·golang·go
嘻嘻嘻嘻嘻嘻ys1 小时前
《Vue 3.3响应式革新与TypeScript高效开发实战指南》
前端·后端
暮乘白帝过重山1 小时前
路由逻辑由 Exchange 和 Binding(绑定) 决定” 的含义
开发语言·后端·中间件·路由流程
CHQIUU1 小时前
告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
spring boot·后端·状态模式
广西千灵通网络科技有限公司2 小时前
基于Django的个性化股票交易管理系统
后端·python·django
CodeFox2 小时前
动态线程池 v1.2.1 版本发布,告警规则重构,bytebuddy 替换 cglib,新增 jmh 基准测试等!
java·后端
tonydf2 小时前
0帧起手本地跑一下BitNet
后端·ai编程
zzmgc42 小时前
常用JVM配置参数
后端