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

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

相关推荐
oak隔壁找我12 分钟前
Elasticsearch QueryBuilders 高级使用案例
java·后端
Zhang青山16 分钟前
【玩转全栈】----Django基本配置和介绍
java·后端
勇敢牛牛_1 小时前
Rust真的适合写业务后端吗?
开发语言·后端·rust
不爱学英文的码字机器1 小时前
深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
java·人工智能·后端·重构
IT_陈寒2 小时前
Vue3性能翻倍秘籍:5个Composition API技巧让你的应用快如闪电⚡
前端·人工智能·后端
Zhang青山2 小时前
使用 Nginx 轻松处理跨域请求(CORS)
java·后端
Victor3563 小时前
Redis(99)Redis的高可用性如何实现?
后端
Victor3563 小时前
Redis(98) Redis的安全更新如何进行?
后端
计算机学姐5 小时前
基于SpringBoot的动漫推荐系统【协同过滤推荐算法+词云图+排行榜】
java·vue.js·spring boot·后端·mysql·intellij-idea·推荐算法
韩立学长7 小时前
基于Springboot的影视评论网站的设计与实现58py6238(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端