当前位置: 首页 > news >正文

23 种设计模式中的迭代器模式

提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式(Iterator)实际上在 Java 的集合类中已经广泛使用了。主要用来提供一种统一的方法来遍历不同的聚合对象。

迭代器模式的核心角色。

  • Iterator(迭代器接口):定义访问和遍历元素的接口
  • ConcreteIterator(具体迭代器):实现迭代器接口,负责管理当前元素的位置
  • Aggregate(聚合接口):定义创建相应迭代器对象的接口
  • ConcreteAggregate(具体聚合):实现聚合接口,返回具体迭代器的实例

下面是一个完整的Java迭代器模式示例:

迭代器接口。

// 迭代器接口
interface Iterator<T> {
    boolean hasNext();
    T next();
}

聚合接口。

// 聚合接口
interface Container<T> {
    Iterator<T> getIterator();
}

具体聚合类。

// 具体聚合类
class NameRepository implements Container<String> {
    private List<String> names = new ArrayList<>();

    public NameRepository(String[] names) {
        for (String name : names) {
            this.names.add(name);
        }
    }

    @Override
    public Iterator<String> getIterator() {
        return new NameIterator();
    }

    // 具体迭代器类(内部类)
    private class NameIterator implements Iterator<String> {
        int index = 0;

        @Override
        public boolean hasNext() {
            return index < names.size();
        }

        @Override
        public String next() {
            if (this.hasNext()) {
                return names.get(index++);
            }
            return null;
        }
    }
}

客户端,测试代码。

// 客户端代码
public class IteratorPatternDemo {
    public static void main(String[] args) {
        String[] names = {"Robert", "John", "Julie", "Lora"};
        NameRepository nameRepository = new NameRepository(names);

        // 获取迭代器
        Iterator<String> iterator = nameRepository.getIterator();
        
        System.out.println("Names in repository:");
        while (iterator.hasNext()) {
            String name = iterator.next();
            System.out.println("Name: " + name);
        }
    }
}

总结

迭代器模式经常被用在遍历集合上,集合通过对外提供统一的Iterator接口来遍历元素,而客户端不需要了解集合内部的数据结构。

在 Java 中,迭代器模式被广泛应用于集合框架中,是处理集合元素遍历的标准方式。

http://www.dtcms.com/a/99881.html

相关文章:

  • Three.js 快速入门教程【十九】CSS2DRenderer(CSS2D渲染器)介绍,实现场景中物体或设备标注标签信息
  • QML中刷新图片的三种方法对比分析
  • [ComfyUI] 如何升级自定义节点(Custom Nodes)
  • 计算机网络和因特网
  • AGI 的概念、意义与未来展望
  • 【AI论文】挑战推理的边界:大型语言模型的数学基准测试
  • Keepass恢复明文主密码漏洞(CVE-2023-3278)复现与hashcat爆破学习
  • Array数组常用方法总结(javascript版)
  • SpringBoot的自动装配原理
  • Redis-常用命令
  • Spring 过滤器(Filter)和过滤器链(Filter Chain)完整示例,包含多个过滤器和Filter 生命周期
  • 简单介绍一下Unity中的material和sharedMaterial
  • PipeWire 音频设计与实现分析三——日志子系统
  • vxe-table 设置单元格可编辑无效问题解决
  • 网络传输优化之多路复用与解复用
  • 流动的梦境:GPT-4o 的自回归图像生成深度解析
  • 聚焦应用常用功能,提升用户体验与分发效率
  • 桥接模式_结构型_GOF23
  • day17 学习笔记
  • Gateway实战入门(四)、断言-请求头以及请求权重分流等
  • Kafka 多线程开发消费者实例
  • 第四天 文件操作(文本/CSV/JSON) - 异常处理机制 - 练习:日志文件分析器
  • 【Python】基于 qwen_agent 构建 AI 绘画智能助手
  • Linux 文件存储和删除原理
  • Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
  • Kafka消息丢失全解析!原因、预防与解决方案
  • 如何查看 SQL Server 的兼容性级别
  • 基于ruoyi快速开发平台搭建----超市仓库管理(修改记录1)
  • 《C++11:通过thread类编写C++多线程程序》
  • 编辑器场景视窗扩展