首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >23种设计模式之迭代器模式

23种设计模式之迭代器模式

作者头像
紫风
发布2025-10-14 18:37:21
发布2025-10-14 18:37:21
11700
代码可运行
举报
运行总次数:0
代码可运行

以下是 迭代器模式 (Iterator Pattern) 的详细介绍,包含定义、优缺点、应用场景及代码实现:

一、迭代器模式概述
  • 英文名称:Iterator
  • 核心目标提供一种方法顺序访问聚合对象中的各个元素,而无需暴露其内部表示,实现遍历逻辑与聚合对象的解耦。
  • 设计思想:将遍历职责委托给迭代器对象,支持不同方式遍历同一聚合结构。
二、优缺点
优点
  1. 解耦遍历逻辑:客户端无需了解聚合对象的内部结构。
  2. 多遍历方式:同一聚合可支持多种迭代器(正序、逆序、过滤等)。
  3. 单一职责:聚合类专注数据存储,迭代器类专注遍历逻辑。
缺点
  1. 类数量增加:每个聚合类需对应迭代器类,增加系统复杂度。
  2. 性能开销:迭代器调用链可能略微降低遍历效率。

三、应用场景
  1. 集合框架:如 Java 的 ListSet 通过 Iterator 遍历元素。
  2. 文件系统遍历:递归遍历目录中的文件和子目录。
  3. 树形结构访问:如 DOM 树的深度优先或广度优先遍历。
  4. 数据库查询结果集:逐行遍历查询结果。

四、代码实现与注释

以下通过 自定义书架的迭代遍历 案例演示迭代器模式:


1. 迭代器接口
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 迭代器接口:定义遍历集合的方法
 */
public interface Iterator<T> {
    boolean hasNext();    // 是否还有下一个元素
    T next();             // 获取下一个元素
    void remove();        // 移除当前元素(可选实现)
}

2. 聚合接口
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 聚合接口:定义创建迭代器的方法
 */
public interface Aggregate<T> {
    Iterator<T> createIterator();
}

3. 具体聚合类(书架)
代码语言:javascript
代码运行次数:0
运行
复制
import java.util.ArrayList;
import java.util.List;

/**
 * 具体聚合类:书架(存储书籍)
 */
public class BookShelf implements Aggregate<Book> {
    private final List<Book> books = new ArrayList<>();

    // 添加书籍
    public void addBook(Book book) {
        books.add(book);
    }

    // 创建迭代器(正序)
    @Override
    public Iterator<Book> createIterator() {
        return new BookShelfIterator(this);
    }

    // 获取书籍数量
    public int size() {
        return books.size();
    }

    // 根据索引获取书籍
    public Book getBookAt(int index) {
        return books.get(index);
    }
}

/**
 * 书籍类(数据模型)
 */
public class Book {
    private final String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}

4. 具体迭代器类(正序遍历)
代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 具体迭代器类:正序遍历书架
 */
public class BookShelfIterator implements Iterator<Book> {
    private final BookShelf bookShelf;
    private int currentIndex = 0;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
    }

    @Override
    public boolean hasNext() {
        return currentIndex < bookShelf.size();
    }

    @Override
    public Book next() {
        Book book = bookShelf.getBookAt(currentIndex);
        currentIndex++;
        return book;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("该迭代器不支持删除操作");
    }
}

5. 客户端调用
代码语言:javascript
代码运行次数:0
运行
复制
public class Client {
    public static void main(String[] args) {
        // 创建书架并添加书籍
        BookShelf shelf = new BookShelf();
        shelf.addBook(new Book("Java 编程思想"));
        shelf.addBook(new Book("设计模式:可复用面向对象软件的基础"));
        shelf.addBook(new Book("Effective Java"));

        // 获取迭代器并遍历
        Iterator<Book> iterator = shelf.createIterator();
        while (iterator.hasNext()) {
            Book book = iterator.next();
            System.out.println("书名:" + book.getTitle());
        }
    }
}

6. 输出结果
代码语言:javascript
代码运行次数:0
运行
复制
书名:Java 编程思想
书名:设计模式:可复用面向对象软件的基础
书名:Effective Java

五、模式结构图
代码语言:javascript
代码运行次数:0
运行
复制
+----------------+          +----------------+
|   Aggregate    | <------+ |   Iterator     |
+----------------+          +----------------+
| +createIterator()         | +hasNext()     |
+----------------+          | +next()        |
                            | +remove()      |
                            +----------------+
       ^                          ^
       |                          |
+----------------+          +----------------+
| ConcreteAggregate        | ConcreteIterator|
+----------------+          +----------------+
| +createIterator()         | -currentIndex  |
+----------------+          +----------------+

六、与其他模式的关系
  1. 组合模式:迭代器可用于遍历组合结构的树形节点。
  2. 工厂方法模式:聚合类通过工厂方法创建特定类型的迭代器。
  3. 访问者模式:迭代器负责遍历,访问者负责对元素执行操作。

七、最佳实践
  1. 支持泛型:使用泛型提高迭代器的类型安全性(如 Iterator<T>)。
  2. 快速失败机制:检测并发修改(如维护 modCount 校验版本号)。
  3. 分离遍历算法:通过不同迭代器实现正序、逆序、过滤遍历。

八、总结
  • 核心价值:解耦遍历逻辑与聚合对象,支持灵活多样的遍历方式。
  • 适用场景:需要统一接口遍历不同结构的集合或隐藏集合内部细节的系统。
  • 关键实现:聚合接口 + 迭代器接口 + 具体迭代器类。

迭代器模式在 Java 生态中广泛应用,例如:

  • Java 集合框架List.iterator()Set.iterator()
  • 文件遍历DirectoryStream 遍历目录内容。
  • 数据库访问ResultSet 逐行读取查询结果。

掌握该模式能显著提升代码的可维护性和扩展性,尤其是在处理复杂数据结构时。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、迭代器模式概述
  • 二、优缺点
    • 优点:
    • 缺点:
  • 三、应用场景
  • 四、代码实现与注释
    • 1. 迭代器接口
    • 2. 聚合接口
    • 3. 具体聚合类(书架)
    • 4. 具体迭代器类(正序遍历)
    • 5. 客户端调用
    • 6. 输出结果
  • 五、模式结构图
  • 六、与其他模式的关系
  • 七、最佳实践
  • 八、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档