14.迭代器模式

介绍

迭代器模式是一种行为型设计模式,它提供一种顺序访问聚合对象中的各个元素,而不暴露聚合对象的内部表示。迭代器模式将遍历元素的责任委托给一个独立的迭代器对象,使得聚合对象和迭代算法可以独立变化而互不影响。

组成

  1. 迭代器接口(Iterator): 定义访问和遍历元素的接口。
  2. 具体迭代器(ConcreteIterator): 实现迭代器接口,负责管理遍历聚合对象的状态。
  3. 聚合接口(Aggregate): 定义创建迭代器对象的接口。
  4. 具体聚合类(ConcreteAggregate): 实现聚合接口,负责创建迭代器对象。
  5. 客户端(Client): 使用迭代器模式的客户端。

结构图

场景

我们可以直接来看看ArrayList中的迭代器是怎么实现的,下面是ArrayList部分源码

代码

客户端代码

java 复制代码
List<String> myList = new ArrayList<>();
myList.add("Item 1");
myList.add("Item 2");
myList.add("Item 3");

// 使用迭代器遍历ArrayList
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

部分源码

java 复制代码
import java.util.*;

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    // ...

    /**
     * Returns an iterator over elements of type {@code E}.
     *
     * @return an Iterator.
     */
    public Iterator<E> iterator() {
        return new Itr();
    }

    // ...

    private class Itr implements Iterator<E> {
        int cursor;       // 游标,表示下一个要返回的元素的索引
        int lastRet = -1; // 最后一个返回的元素的索引,初始值为-1
        int expectedModCount = modCount; // 迭代器创建时的modCount

        public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification(); // 检查迭代器创建后集合是否被修改过
            int i = cursor;
            if (i >= size) {
                throw new NoSuchElementException();
            }
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {
                throw new ConcurrentModificationException();
            }
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

        // 检查迭代器创建后集合是否被修改过
        final void checkForComodification() {
            if (modCount != expectedModCount) {
                throw new ConcurrentModificationException();
            }
        }
    }

    // ...
}

ArrayList 其实就是具体聚集类,然后内部类Itr就是具体迭代器类,下面是一些关键点:

  1. iterator() 方法: 返回一个新的 Itr 实例,即 ArrayList 的迭代器。
  2. Itr 内部类: 实现了 Iterator 接口,包含 hasNext() 和 next() 方法用于遍历集合。
  3. cursor 和 lastRet: cursor 表示下一个要返回的元素的索引,lastRet 表示最后一个返回的元素的索引。在 next() 方法中,lastRet 用于记录当前返回的元素的索引。
  4. checkForComodification() 方法: 检查迭代器创建后集合是否被修改过。通过比较迭代器创建时的 modCount 和当前 ArrayList 的 modCount 来判断是否有其他线程修改了集合。

这里的 Itr 内部类是 ArrayList 的私有类,通过迭代器访问元素时,使用了 cursor 来迭代元素,同时进行了并发修改的检查。这样可以确保在迭代过程中,如果集合被修改,会抛出 ConcurrentModificationException,从而保证迭代器的安全性。

相关推荐
on the way 1234 分钟前
行为型设计模式之Mediator(中介者)
java·设计模式·中介者模式
保持学习ing6 分钟前
Spring注解开发
java·深度学习·spring·框架
techzhi7 分钟前
SeaweedFS S3 Spring Boot Starter
java·spring boot·后端
异常君31 分钟前
Spring 中的 FactoryBean 与 BeanFactory:核心概念深度解析
java·spring·面试
weixin_461259411 小时前
[C]C语言日志系统宏技巧解析
java·服务器·c语言
cacyiol_Z1 小时前
在SpringBoot中使用AWS SDK实现邮箱验证码服务
java·spring boot·spring
竹言笙熙1 小时前
Polarctf2025夏季赛 web java ez_check
java·学习·web安全
写bug写bug1 小时前
手把手教你使用JConsole
java·后端·程序员
异常君1 小时前
Java 中 try-catch 的性能真相:全面分析与最佳实践
java·面试·代码规范