概念

迭代器设计模式(Iterator Design Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象(如集合)的元素,而不需要暴露该对象的底层表示。迭代器模式可以帮助我们在不关心底层数据结构的情况下,遍历一个集合。

组成角色

  1. 抽象迭代器(Iterator):定义遍历元素所需的接口,通常包括 hasNext() 和 next() 方法。
  2. 具体迭代器(Concrete Iterator):实现抽象迭代器接口,完成对聚合对象的遍历。
  3. 抽象聚合(Aggregate):定义创建迭代器对象的接口,通常包括一个创建迭代器的方法。
  4. 具体聚合(Concrete Aggregate):实现抽象聚合接口,实例化具体迭代器。

相关图示

图片来自:https://refactoringguru.cn/design-patterns/iterator

示例代码

import java.util.ArrayList;
import java.util.List;// 抽象迭代器接口
interface Iterator {boolean hasNext();Object next();
}// 具体迭代器
class ConcreteIterator implements Iterator {private List<Object> list;private int position = 0;public ConcreteIterator(List<Object> list) {this.list = list;}@Overridepublic boolean hasNext() {return position < list.size();}@Overridepublic Object next() {return list.get(position++);}
}// 逆序具体迭代器
class ReverseConcreteIterator implements Iterator {private List<Object> list;private int position;public ReverseConcreteIterator(List<Object> list) {this.list = list;position = list.size() - 1;}@Overridepublic boolean hasNext() {return position >= 0;}@Overridepublic Object next() {return list.get(position--);}
}// 抽象聚合接口
interface Aggregate {Iterator createIterator(boolean reverse);
}// 具体聚合
class ConcreteAggregate implements Aggregate {private List<Object> list = new ArrayList<>();public void addItem(Object item) {list.add(item);}@Overridepublic Iterator createIterator(boolean reverse) {return reverse ? new ReverseConcreteIterator(list) : new ConcreteIterator(list);}
}// 客户端代码
public class IteratorDemo {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate();aggregate.addItem("Item 1");aggregate.addItem("Item 2");aggregate.addItem("Item 3");//顺序输出Iterator iterator = aggregate.createIterator(false);System.out.println("Normal order:");while (iterator.hasNext()) {System.out.println(iterator.next());}//逆序输出Iterator reverseIterator = aggregate.createIterator(true);System.out.println("\nReverse order:");while (reverseIterator.hasNext()) {System.out.println(reverseIterator.next());}}
}

框架中的运用

迭代器设计模式被广泛用于集合框架。集合框架包括一系列用于处理一组对象的接口和类,例如 List、Set 和 Map。迭代器设计模式使得遍历和操作这些集合变得简单和一致。

Java 集合框架中的迭代器设计模式主要涉及两个接口:java.util.Iteratorjava.lang.Iterable

  1. java.util.Iterator:这是一个迭代器接口,定义了用于遍历集合元素的方法。主要方法有:

    • boolean hasNext():如果仍有元素可以迭代,则返回 true。
    • E next():返回迭代的下一个元素。
    • void remove():从底层集合中移除迭代器返回的最后一个元素(可选操作)。
  2. java.lang.Iterable:这是一个表示可迭代对象的接口,通常由集合类实现。主要方法有:
    • Iterator<E> iterator():返回一个迭代器,用于遍历集合元素。

ArrayList 是一个实现了 java.util.List 接口的可调整大小的数组。List 接口扩展了 java.util.Collection,而 Collection 接口扩展了 java.lang.Iterable。因此,ArrayList 类需要实现 Iterable 接口中的 iterator() 方法。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {// ...// 实现 Iterable 接口中的 iterator() 方法public Iterator<E> iterator() {return new Itr();}// 内部类 Itr 实现了 Iterator 接口private class Itr implements Iterator<E> {int cursor;       // 下一个元素的索引int lastRet = -1; // 上一个元素的索引// 实现 Iterator 接口中的 hasNext() 方法public boolean hasNext() {return cursor != size;}// 实现 Iterator 接口中的 next() 方法@SuppressWarnings("unchecked")public E next() {// ...Object[] elementData = ArrayList.this.elementData;int i = cursor;cursor = i + 1;return (E) elementData[lastRet = i];}// 实现 Iterator 接口中的 remove() 方法public void remove() {if (lastRet < 0)throw new IllegalStateException();// ...ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;}}
}

适用场景

  1. 不同的数据结构:当需要访问和遍历不同类型的数据结构(如数组、链表、树或图等)时,迭代器设计模式提供了一种统一的接口,使客户端代码能够以相同的方式处理这些不同的数据结构。
  2. 抽象数据访问:当需要对集合或容器中的元素进行访问,而不需要关心集合的具体实现细节时,迭代器设计模式可以提供一个抽象的访问接口,使得客户端代码可以处理元素而不依赖于容器的内部结构。
  3. 容器内部结构的封装:迭代器设计模式可以将容器的内部结构封装起来,使得容器的实现可以在不影响客户端代码的情况下进行修改。
  4. 支持多种遍历方式:当需要为集合提供多种遍历方式(例如正序遍历、逆序遍历、层次遍历等)时,可以为每种遍历方式实现一个具体的迭代器,这使得客户端代码可以方便地切换不同的遍历方式。

迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]相关推荐

  1. 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

    文章目录 概念 相关图示 代码示例 框架中的应用 场景 多个生成器(Concrete Builder): 单个生成器 概念 生成器设计模式(Builder Design Pattern)是一种创建型设 ...

  2. 设计模式(Design Pattern)

    简介 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...

  3. 几种常用的设计模式 (Design Pattern)

    文章目录 设计模式(Design Pattern) 一.设计模式的分类 1. 基础型模式 (Fundamental Pattern) 2. 创建型模式 (Creational Pattern) 3. ...

  4. 设计模式(Design pattern—

    设计模式(Design Pattern)系列视频教程(附PDF文档) 设计模式(Design pattern-使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式 ...

  5. C# 版本设计模式(Design Pattern)(转)

    C# 版本设计模式(Design Pattern)---------------总序 今天在写代码的时候,突然想到了一个非常有趣的问题,就是非常经典的一个问题:猫叫了,老师跑了,主人醒了. 也不知道自 ...

  6. 初读设计模式-----《design pattern explained》读后感

    从网上淘来了一本<design pattern explained>,用了半个月的时间细细的读完了这本书. 本打算单单的从技术角度进行总结的,但是却全然没有头绪.说说自己的粗浅的感悟吧.. ...

  7. 巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验

    这篇文章介绍一种使用代理设计模式(Proxy Design Pattern)的方法来改善您的前端应用里图片加载的体验. 假设我们的应用里需要显示一张尺寸很大的图片,位于远端服务器.我们用一些前端框架的 ...

  8. C# 版本设计模式(Design Pattern)---------------总序

    今天在写代码的时候,突然想到了一个非常有趣的问题,就是非常经典的一个问题:猫叫了,老师跑了,主人醒了. 也不知道自己脑子里面在想些什么,怎么突然蹦出来了这个想法,后来想想,是时候该谢谢关于设计模式的博 ...

  9. 中介者设计模式(Mediator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、适用场景]

    文章目录 概念 组成角色 相关图示 示例代码 适用场景 概念 中介者设计模式是一种行为型设计模式,它通过引入一个中介对象来封装一组对象之间的交互,使得对象之间不需要显式地相互引用,从而降低它们之间的耦 ...

最新文章

  1. 回应关于《BCH五月硬分叉是伪需求》的疑问
  2. DOSBOX使用的一些方法和注意点(汇编实验中遇到的)
  3. 反思深度思考:预热[准备] 高密度[压力专注] 辨真伪[冷静分析] 反推[灵活] 结构化[全局]
  4. ASMCMD 命令详解
  5. CGAffineTransform
  6. 第三届蓝桥杯决赛真题---数量周期
  7. CHIL-SQL-FOREIGN KEY 约束
  8. 【Python】CentOs7 Python3安装Openssl以及解决ssl问题
  9. linux 路由添加
  10. linux 关于数据库的部分命令
  11. 2021 年百度之星·程序设计大赛 - 初赛二
  12. 精读《useEffect 完全指南》
  13. 【Julia】 解决安装包下载慢的问题
  14. uniapp调用微信小程序人脸识别步骤
  15. SOFARPC —— SPI 解析
  16. 上海mba学费一览表2021
  17. mysql错误1273_mysql8 参考手册--错误代码1273-1294
  18. 苹果支付成功后,JAVA服务端二次验证
  19. 转:Yahoo!网站性能最佳体验的34条黄金守则——图片、Coockie与移动应用
  20. 数据预处理--对偏态数据

热门文章

  1. ffmpeg 设置 改变 默认 音轨 声道 顺序 shell 懒人系列-23
  2. 一年一折腾,今年二折腾
  3. 黑客透过网络钓鱼邮件散播间谍程序 恐让商业机密外泄
  4. 分布式理论:2pc与3pc
  5. unity3d 植物风力晃动材质 非地形风力
  6. 在密铺的瓷砖背后,隐藏着令人毛骨悚然的幻影....
  7. centos vim显示行号
  8. TCP Reno/Westwood 的效率和公平
  9. linux系统suid提权
  10. java 参数传递实体类_Java8实战——通过行为参数化传递代码