news 2026/2/28 2:56:34

设计模式——迭代器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——迭代器模式

迭代器模式 (Iterator Pattern)

什么是迭代器模式?

迭代器模式是一种行为型设计模式,它允许你遍历集合对象中的元素,而不暴露集合的内部表示

简单来说:迭代器模式就是提供一个统一的接口来遍历不同的集合。

生活中的例子

想象一下:

  • 电视遥控器:上一个频道、下一个频道
  • 音乐播放器:上一首、下一首
  • 翻书:上一页、下一页

为什么需要迭代器模式?

传统方式的问题

// 客户端需要了解集合的内部结构for(inti=0;i<list.size();i++){System.out.println(list.get(i));}

问题

  1. 暴露内部:暴露了集合的内部结构
  2. 不统一:不同集合的遍历方式不同
  3. 难以扩展:新增集合类型需要修改客户端

迭代器模式的优势

// 使用迭代器Iteratoriterator=collection.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}

优势

  1. 统一接口:提供统一的遍历接口
  2. 隐藏内部:隐藏集合的内部结构
  3. 易于扩展:新增集合类型很容易

迭代器模式的结构

┌─────────────────────┐ │ Iterator │ 迭代器接口 ├─────────────────────┤ │ + hasNext(): boolean│ │ + next(): Object │ └──────────┬──────────┘ │ 实现 │ ┌──────────┴──────────┐ │ ConcreteIterator │ 具体迭代器 ├─────────────────────┤ │ - index: int │ │ - collection: Col │ │ + hasNext(): boolean│ │ + next(): Object │ └─────────────────────┘ ┌─────────────────────┐ │ Iterable │ 可迭代接口 ├─────────────────────┤ │ + iterator(): Iter │ └──────────┬──────────┘ │ 实现 │ ┌──────────┴──────────┐ │ ConcreteCollection │ 具体集合 ├─────────────────────┤ │ - elements: List │ │ + iterator(): Iter │ └─────────────────────┘

代码示例

1. 定义迭代器接口

/** * 迭代器接口 */publicinterfaceIterator{/** * 是否有下一个元素 */booleanhasNext();/** * 获取下一个元素 */Objectnext();}

2. 定义可迭代接口

/** * 可迭代接口 */publicinterfaceIterable{/** * 获取迭代器 */Iteratoriterator();}

3. 定义具体迭代器

/** * 具体迭代器 */publicclassConcreteIteratorimplementsIterator{privateList<Object>elements;privateintindex=0;publicConcreteIterator(List<Object>elements){this.elements=elements;}@OverridepublicbooleanhasNext(){returnindex<elements.size();}@OverridepublicObjectnext(){if(hasNext()){returnelements.get(index++);}returnnull;}}

4. 定义具体集合

/** * 具体集合 */publicclassConcreteCollectionimplementsIterable{privateList<Object>elements=newArrayList<>();publicvoidadd(Objectelement){elements.add(element);}@OverridepublicIteratoriterator(){returnnewConcreteIterator(elements);}}

5. 使用迭代器

/** * 迭代器模式测试类 * 演示如何使用迭代器模式遍历集合 */publicclassIteratorTest{publicstaticvoidmain(String[]args){System.out.println("=== 迭代器模式测试 ===\n");// 创建集合ConcreteCollectioncollection=newConcreteCollection();collection.add("元素1");collection.add("元素2");collection.add("元素3");collection.add("元素4");collection.add("元素5");// 使用迭代器遍历System.out.println("--- 使用迭代器遍历 ---");Iteratoriterator=collection.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}System.out.println("\n=== 迭代器模式的优势 ===");System.out.println("1. 统一接口:提供统一的遍历接口");System.out.println("2. 隐藏内部:隐藏集合的内部结构");System.out.println("3. 易于扩展:新增集合类型很容易");System.out.println("4. 简化客户端:简化客户端代码");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. 集合框架:Java集合框架");System.out.println("2. 数据库查询:数据库结果集");System.out.println("3. 文件遍历:文件系统遍历");System.out.println("4. 树形结构:树形结构遍历");System.out.println("\n=== Java中的迭代器 ===");System.out.println("Java中的集合框架都实现了Iterable接口:");System.out.println("- List: ArrayList, LinkedList");System.out.println("- Set: HashSet, TreeSet");System.out.println("- Map: HashMap, TreeMap (通过entrySet())");System.out.println("\n使用for-each循环:");System.out.println("for (Object element : collection) {");System.out.println(" System.out.println(element);");System.out.println("}");}}

迭代器模式的优点

  1. 统一接口:提供统一的遍历接口
  2. 隐藏内部:隐藏集合的内部结构
  3. 易于扩展:新增集合类型很容易
  4. 简化客户端:简化客户端代码

迭代器模式的缺点

  1. 增加复杂度:引入了额外的类
  2. 性能开销:多了一层调用

适用场景

  1. 遍历集合:需要遍历集合对象
  2. 统一接口:需要统一的遍历接口
  3. 隐藏内部:需要隐藏集合的内部结构

常见应用场景

  • 集合框架:Java集合框架
  • 数据库查询:数据库结果集
  • 文件遍历:文件系统遍历

使用建议

  • 遍历集合:使用迭代器模式
  • 统一接口:使用迭代器模式
  • 简单遍历:直接使用for循环即可

注意事项

⚠️ 迭代器模式虽然有用,但要注意:

  • 考虑使用for-each循环
  • 注意并发修改问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/25 16:28:08

RMBG-2.0轻量模型原理简析:如何在小参数量下实现发丝级分割

RMBG-2.0轻量模型原理简析&#xff1a;如何在小参数量下实现发丝级分割 1. 为什么你需要一个“能看清头发”的抠图工具 你有没有试过用传统抠图工具处理一张带飘逸发丝的证件照&#xff1f;边缘毛躁、半透明区域糊成一片、发丝和背景粘连——最后不得不花半小时手动擦除&…

作者头像 李华
网站建设 2026/2/27 7:30:56

小白友好!Nano-Banana极简纯白风格入门指南,3步出效果

小白友好&#xff01;Nano-Banana极简纯白风格入门指南&#xff0c;3步出效果 你是不是也遇到过这些情况&#xff1f; 想给新设计的服装做一张专业级展示图&#xff0c;但不会用PS&#xff0c;更搞不定3D建模软件&#xff1b;看到别人生成的爆炸图、技术蓝图惊艳不已&#xf…

作者头像 李华
网站建设 2026/2/15 21:10:28

Swin2SR交互指南:左侧面板上传与右侧结果查看

Swin2SR交互指南&#xff1a;左侧面板上传与右侧结果查看 1. 这不是普通放大&#xff0c;是AI显微镜在工作 你有没有试过把一张模糊的截图、马赛克严重的表情包&#xff0c;或者AI生成后只有512像素的小图&#xff0c;直接拉大到打印尺寸&#xff1f;结果往往是——满屏锯齿、…

作者头像 李华
网站建设 2026/2/27 0:21:17

MusePublic艺术创作引擎:5分钟快速生成时尚人像的保姆级教程

MusePublic艺术创作引擎&#xff1a;5分钟快速生成时尚人像的保姆级教程 1. 为什么你需要这个工具——从“修图苦手”到“人像艺术家”的转变 你有没有过这样的经历&#xff1a;想为小红书配一张高级感封面&#xff0c;翻遍图库找不到合适的模特图&#xff1b;想给服装品牌做…

作者头像 李华
网站建设 2026/2/24 15:52:14

SeqGPT-560M多场景落地:医疗问诊记录分类、法律合同关键条款抽取

SeqGPT-560M多场景落地&#xff1a;医疗问诊记录分类、法律合同关键条款抽取 1. 为什么零样本能力正在改变NLP落地方式 你有没有遇到过这样的情况&#xff1a;手头有一批医疗问诊记录&#xff0c;需要快速归类到“复诊咨询”“用药疑问”“检查报告解读”等几类&#xff0c;但…

作者头像 李华