当前位置:首页 > 技术 > 正文内容

迭代器模式:实现集合遍历的设计方案

访客 技术 2026年7月7日 1

迭代器模式概述

迭代器模式是一种行为型设计模式,它提供了一种顺序访问集合对象中各个元素的方法,而无需暴露集合对象的底层实现结构。在Java等面向对象编程语言中,迭代器模式被广泛应用于集合框架的实现中。

迭代器模式的核心思想是将集合的遍历操作与集合本身分离,使得同一个集合可以被多种不同的方式进行遍历。这种模式使得集合类的使用更加灵活,同时也符合单一职责原则。

迭代器与增强for循环

在Java中,增强for循环(for-each循环)的底层实现正是基于迭代器模式。当我们使用增强for循环遍历集合时,编译器会自动将其转换为使用迭代器的代码。

例如,下面的代码:

List<String> names = Arrays.asList("张三", "李四", "王五");
for (String name : names) {
    System.out.println(name);
}

在编译后,实际上会被转换为:

List<String> names = Arrays.asList("张三", "李四", "王五");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    String name = iterator.next();
    System.out.println(name);
}

从转换后的代码可以看出,增强for循环本质上是通过迭代器来实现的。迭代器就像一个指向集合元素的指针,通过不断移动这个指针来依次访问集合中的每个元素。

迭代器模式的实现

下面,我们将实现一个自定义的迭代器模式。我们将创建一个自定义的集合类,并为其实现迭代器功能。

1. 定义自定义集合类

/**
 * 自定义集合类
 * 实现Iterable接口表示此类支持迭代操作
 */
public class CustomCollection<E> implements Iterable<E> {
    
    // 使用数组存储元素
    private final E[] elements;
    
    // 私有构造器
    private CustomCollection(E[] elements) {
        this.elements = elements;
    }
    
    // 工厂方法创建实例
    public static <E> CustomCollection<E> create(E[] elements) {
        return new CustomCollection<>(elements);
    }
    
    // 实现iterator方法,返回迭代器
    @Override
    public Iterator<E> iterator() {
        return new CustomIterator();
    }
    
    // 自定义迭代器实现
    private class CustomIterator implements Iterator<E> {
        
        // 当前迭代位置
        private int position = 0;
        
        // 判断是否有下一个元素
        @Override
        public boolean hasNext() {
            return position < elements.length;
        }
        
        // 获取下一个元素并移动指针
        @Override
        public E next() {
            if (!hasNext()) {
                throw new NoSuchElementException("没有更多元素了");
            }
            return elements[position++];
        }
    }
}

2. 使用自定义迭代器

// 创建数组
Integer[] numbers = {1, 2, 3, 4, 5};
// 使用自定义集合类处理数组
CustomCollection<Integer> collection = CustomCollection.create(numbers);
// 使用增强for循环遍历,底层会调用迭代器
for (Integer num : collection) {
    System.out.println(num);
}

编译后的代码实际上会转换为:

// 创建数组
Integer[] numbers = {1, 2, 3, 4, 5};
// 使用自定义集合类处理数组
CustomCollection<Integer> collection = CustomCollection.create(numbers);
// 获取迭代器
Iterator<Integer> iterator = collection.iterator();
// 使用迭代器遍历
while (iterator.hasNext()) {
    Integer num = iterator.next();
    System.out.println(num);
}

输出结果为:

1
2
3
4
5

迭代器模式的优缺点

优点

  1. 支持以多种不同方式遍历同一个聚合对象。
  2. 简化了聚合类的实现,将遍历逻辑分离到迭代器中。
  3. 可以在同一个聚合对象上同时进行多个遍历操作。
  4. 符合开闭原则,增加新的聚合类和迭代器类时无需修改原有代码。

缺点

  1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要同时增加对应的迭代器类,这会导致系统中类的数量增加,增加系统复杂度。
  2. 对于简单的聚合结构,使用迭代器模式可能会显得过于复杂。

迭代器模式的使用场景

  1. 当需要访问一个聚合对象的内容,而不希望暴露其内部表示时。
  2. 当需要为聚合对象提供多种不同的遍历方式时。
  3. 当需要为不同类型的聚合结构提供统一的遍历接口时。
  4. 当希望在同一个聚合对象上进行多个遍历操作时。
标签: 设计模式

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。