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

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

相关推荐
你的人类朋友4 分钟前
【Node】单线程的Node.js为什么可以实现多线程?
前端·后端·node.js
iナナ1 小时前
Spring Web MVC入门
java·前端·网络·后端·spring·mvc
CoderYanger1 小时前
优选算法-双指针:2.复写零
java·后端·算法·leetcode·职场和发展
数据知道2 小时前
Go基础:用Go语言操作MongoDB详解
服务器·开发语言·数据库·后端·mongodb·golang·go语言
大鱼七成饱4 小时前
apache POI 万字总结:满足你对报表一切幻想
后端
数据知道5 小时前
Go基础:Go语言应用的各种部署
开发语言·后端·golang·go语言
数据知道7 小时前
Go基础:用Go语言操作MySQL详解
开发语言·数据库·后端·mysql·golang·go语言
种时光的人7 小时前
无状态HTTP的“记忆”方案:Spring Boot中Cookie&Session全栈实战
服务器·spring boot·后端·http
m0_480502648 小时前
Rust 登堂 之 Cell 和 RefCell(十二)
开发语言·后端·rust
LunarCod8 小时前
Onvif设备端项目框架介绍
后端·嵌入式·c/c++·wsdl·rv1126·onvif