Java 设计模式之迭代器模式:优雅遍历集合元素

简介: 迭代器模式将集合遍历逻辑分离为独立迭代器,实现遍历与存储解耦。支持统一接口遍历不同集合,隐藏内部结构,符合单一职责原则,广泛应用于Java集合框架。

Java 设计模式之迭代器模式:优雅遍历集合元素

在日常开发中,我们经常需要遍历各种集合对象(如列表、集合、树等)。如果每个集合都自行实现遍历逻辑,不仅会导致代码冗余,还会暴露内部结构,违背封装原则。迭代器模式(Iterator Pattern)正是为解决这类问题而生,它提供了一种统一的方式来遍历不同集合,同时隐藏底层实现细节。

迭代器模式的核心思想

迭代器模式属于行为型设计模式,它的核心是将集合对象的遍历行为分离出来,封装成独立的迭代器对象,使迭代逻辑与集合本身解耦。这样做的好处是:

  • 支持以不同方式遍历同一个集合
  • 简化集合类的设计,无需关心遍历实现
  • 符合单一职责原则,集合只负责存储数据,迭代器负责遍历
  • 可以在遍历过程中安全地修改集合(需特殊处理)

迭代器模式的角色组成

迭代器模式主要包含以下四个角色:

  1. 抽象迭代器(Iterator):定义遍历元素的接口,通常包含hasNext()next()方法
  2. 具体迭代器(ConcreteIterator):实现抽象迭代器接口,记录当前遍历位置
  3. 抽象聚合(Aggregate):定义创建迭代器的接口,声明一个createIterator()方法
  4. 具体聚合(ConcreteAggregate):实现抽象聚合接口,返回具体迭代器实例

迭代器模式的代码实现

下面我们通过一个图书管理系统的例子来实现迭代器模式。

1. 定义抽象迭代器接口

// 抽象迭代器
public interface Iterator {
   
    // 判断是否还有下一个元素
    boolean hasNext();

    // 获取下一个元素
    Object next();
}

2. 定义具体迭代器实现

// 具体迭代器 - 图书迭代器
public class BookIterator implements Iterator {
   
    private Book[] books;
    private int position; // 当前遍历位置

    public BookIterator(Book[] books) {
   
        this.books = books;
        this.position = 0;
    }

    @Override
    public boolean hasNext() {
   
        return position < books.length && books[position] != null;
    }

    @Override
    public Object next() {
   
        Book book = books[position];
        position++;
        return book;
    }
}

3. 定义抽象聚合接口

// 抽象聚合
public interface Aggregate {
   
    // 创建迭代器
    Iterator createIterator();
}

4. 定义具体聚合实现

// 图书类
public class Book {
   
    private String name;

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

    public String getName() {
   
        return name;
    }
}

// 具体聚合 - 图书书架
public class BookShelf implements Aggregate {
   
    private Book[] books;
    private int last; // 最后一本书的位置

    public BookShelf(int maxSize) {
   
        this.books = new Book[maxSize];
        this.last = 0;
    }

    public Book getBookAt(int index) {
   
        return books[index];
    }

    public void appendBook(Book book) {
   
        this.books[last] = book;
        last++;
    }

    public int getLength() {
   
        return last;
    }

    @Override
    public Iterator createIterator() {
   
        return new BookIterator(books);
    }
}

5. 客户端使用示例

public class Client {
   
    public static void main(String[] args) {
   
        // 创建书架并添加图书
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Java编程思想"));
        bookShelf.appendBook(new Book("设计模式:可复用面向对象软件的基础"));
        bookShelf.appendBook(new Book("深入理解Java虚拟机"));
        bookShelf.appendBook(new Book("Effective Java"));

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

运行结果:

图书名称:Java编程思想
图书名称:设计模式:可复用面向对象软件的基础
图书名称:深入理解Java虚拟机
图书名称:Effective Java

Java 集合框架中的迭代器模式

实际上,Java 集合框架(Collection Framework)大量使用了迭代器模式。java.util.Iterator接口就是抽象迭代器,而ArrayListHashSet等集合类则是具体聚合,它们通过iterator()方法返回具体迭代器实现。

例如,我们常用的遍历方式:

List<String> list = new ArrayList<>();
// 添加元素...
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
   
    String element = iterator.next();
    // 处理元素
}

这种方式正是迭代器模式的典型应用,它使我们可以用统一的方式遍历不同的集合,而不必关心其内部实现。

迭代器模式的适用场景

  • 当需要为聚合对象提供多种遍历方式时
  • 当需要遍历不同的聚合结构(如数组、链表、树等)时
  • 当希望隐藏聚合对象的内部实现,只暴露遍历接口时
  • 当需要在遍历过程中对聚合对象进行修改,且不影响遍历过程时

迭代器模式的优缺点

优点:

  • 实现了遍历算法与聚合对象的分离
  • 可以为一个聚合对象提供多种遍历方式
  • 简化了聚合类的设计
  • 支持对聚合对象的多种遍历

缺点:

  • 增加了类的数量,一定程度上增加了系统复杂度
  • 如果聚合对象的结构发生变化,可能需要修改迭代器的实现

总结

迭代器模式通过将遍历逻辑封装在独立的迭代器对象中,实现了聚合对象与遍历算法的解耦。它不仅提供了统一的遍历接口,简化了客户端代码,还保护了聚合对象的内部结构。

在实际开发中,我们很少需要自己实现迭代器模式,因为 Java 集合框架已经为我们提供了完善的迭代器支持。但理解迭代器模式的设计思想,有助于我们更好地使用这些 API,以及在面对复杂集合结构时设计出更灵活、更易维护的代码。

目录
相关文章
|
10月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2610 35
|
10月前
|
设计模式 消息中间件 前端开发
Java 设计模式之中介者模式:解耦复杂交互的架构艺术(含 UML 图解)
中介者模式通过引入协调者解耦多个对象间的复杂交互,将网状依赖转化为星型结构。适用于聊天室、GUI事件系统等场景,提升可维护性与扩展性,但需防中介者过度膨胀。
538 3
|
10月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1094 157
|
10月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
5527 112
|
4月前
|
Oracle Java 关系型数据库
在Linux环境安装JDK21
本文详细介绍了在Linux系统中下载并安装JDK 21的完整流程:从Oracle官网下载JDK 21 Linux版tar.gz包,删除旧版JDK 8(可选),解压安装,修改`/etc/profile`配置`JAVA_HOME`与`PATH`,最后通过`source`生效并验证`java -version`。同时提供JDK历史版本下载指引。
在Linux环境安装JDK21
|
10月前
|
SQL 关系型数据库 MySQL
开源新发布|PolarDB-X v2.4.2开源生态适配升级
PolarDB-X v2.4.2开源发布,重点完善生态能力:新增客户端驱动、开源polardbx-proxy组件,支持读写分离与高可用;强化DDL变更、扩缩容等运维能力,并兼容MySQL主备复制及MCP AI生态。
开源新发布|PolarDB-X v2.4.2开源生态适配升级
|
10月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
940 2
|
10月前
|
人工智能
实训Agent创客:一键生成电商场景Agent
在阿里云百炼一键生成电商场景Agent,轻松帮您搞定商品展示图片、视频。快来参与活动任务吧!
1081 2
|
10月前
|
设计模式 Java 程序员
Java 设计模式之工厂模式:对象创建的艺术(含 UML 图解)
本文详解Java工厂模式三大形态:简单工厂、工厂方法与抽象工厂,结合UML图解与代码实例,剖析其核心思想——“创建与使用分离”。通过计算器、日志系统、电子设备等案例,深入讲解各模式的实现原理、适用场景及优缺点,并对比选择策略。最后揭示工厂模式在JDK和主流框架中的实际应用,帮助开发者掌握对象创建的艺术,提升代码扩展性与可维护性。(238字)
1020 5
|
10月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
667 8

热门文章

最新文章