23种设计模式之迭代器模式
以下是 迭代器模式 (Iterator Pattern) 的详细介绍,包含定义、优缺点、应用场景及代码实现:
一、迭代器模式概述
-
英文名称:Iterator
-
核心目标:提供一种方法顺序访问聚合对象中的各个元素,而无需暴露其内部表示,实现遍历逻辑与聚合对象的解耦。
-
设计思想:将遍历职责委托给迭代器对象,支持不同方式遍历同一聚合结构。
二、优缺点
优点:
-
解耦遍历逻辑:客户端无需了解聚合对象的内部结构。
-
多遍历方式:同一聚合可支持多种迭代器(正序、逆序、过滤等)。
-
单一职责:聚合类专注数据存储,迭代器类专注遍历逻辑。
缺点:
-
类数量增加:每个聚合类需对应迭代器类,增加系统复杂度。
-
性能开销:迭代器调用链可能略微降低遍历效率。
三、应用场景
-
集合框架:如 Java 的
List、Set通过Iterator遍历元素。 -
文件系统遍历:递归遍历目录中的文件和子目录。
-
树形结构访问:如 DOM 树的深度优先或广度优先遍历。
-
数据库查询结果集:逐行遍历查询结果。
四、代码实现与注释
以下通过 自定义书架的迭代遍历 案例演示迭代器模式:
1. 迭代器接口
/**
* 迭代器接口:定义遍历集合的方法
*/
public interface Iterator<T> {
boolean hasNext(); // 是否还有下一个元素
T next(); // 获取下一个元素
void remove(); // 移除当前元素(可选实现)
}
2. 聚合接口
/**
* 聚合接口:定义创建迭代器的方法
*/
public interface Aggregate<T> {
Iterator<T> createIterator();
}
3. 具体聚合类(书架)
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. 具体迭代器类(正序遍历)
/**
* 具体迭代器类:正序遍历书架
*/
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. 客户端调用
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. 输出结果
书名:Java 编程思想
书名:设计模式:可复用面向对象软件的基础
书名:Effective Java
五、模式结构图
+----------------+ +----------------+
| Aggregate | <------+ | Iterator |
+----------------+ +----------------+
| +createIterator() | +hasNext() |
+----------------+ | +next() |
| +remove() |
+----------------+
^ ^
| |
+----------------+ +----------------+
| ConcreteAggregate | ConcreteIterator|
+----------------+ +----------------+
| +createIterator() | -currentIndex |
+----------------+ +----------------+
六、与其他模式的关系
-
组合模式:迭代器可用于遍历组合结构的树形节点。
-
工厂方法模式:聚合类通过工厂方法创建特定类型的迭代器。
-
访问者模式:迭代器负责遍历,访问者负责对元素执行操作。
七、最佳实践
-
支持泛型:使用泛型提高迭代器的类型安全性(如
Iterator<T>)。 -
快速失败机制:检测并发修改(如维护
modCount校验版本号)。 -
分离遍历算法:通过不同迭代器实现正序、逆序、过滤遍历。
八、总结
-
核心价值:解耦遍历逻辑与聚合对象,支持灵活多样的遍历方式。
-
适用场景:需要统一接口遍历不同结构的集合或隐藏集合内部细节的系统。
-
关键实现:聚合接口 + 迭代器接口 + 具体迭代器类。
迭代器模式在 Java 生态中广泛应用,例如:
-
Java 集合框架:
List.iterator()、Set.iterator()。 -
文件遍历:
DirectoryStream遍历目录内容。 -
数据库访问:
ResultSet逐行读取查询结果。
掌握该模式能显著提升代码的可维护性和扩展性,尤其是在处理复杂数据结构时。
更多推荐



所有评论(0)