17.设计模式-ITERATOR(迭代器)
一、模式定义与核心价值
迭代器模式是一种行为型设计模式,其核心目标是提供一种统一的方式顺序访问聚合对象(如集合)中的元素,而无需暴露其内部实现细节。通过解耦遍历逻辑与数据结构,该模式赋予系统以下核心能力:
- 解耦访问与存储:客户端无需了解集合的底层结构(如数组、链表、树),即可完成遍历操作。
- 灵活扩展:支持多种遍历方式(正序、逆序、过滤)和复合数据结构(树形、图结构)的遍历。
- 单一职责原则:集合类专注于数据存储,迭代器类专注于遍历逻辑,职责分离提升代码可维护性。
工业级场景:
- Java集合框架中的
Iterator接口(如ArrayList.iterator()) - 文件系统目录树的递归遍历
- 数据库查询结果的分页处理
- 游戏引擎中粒子系统的状态遍历
二、模式组成与UML类图
核心角色
- Iterator(抽象迭代器)
-
- 定义遍历元素的接口(
hasNext()、next()等)
- 定义遍历元素的接口(
- ConcreteIterator(具体迭代器)
-
- 实现迭代逻辑,维护遍历位置状态(如
ConcreteIterator类)
- 实现迭代逻辑,维护遍历位置状态(如
- Aggregate(抽象聚合)
-
- 声明创建迭代器的方法(
createIterator()或iterator())
- 声明创建迭代器的方法(
- ConcreteAggregate(具体聚合)
-
- 管理元素集合,返回对应的具体迭代器(如
BookShelf类)
- 管理元素集合,返回对应的具体迭代器(如
UML类图
classDiagram
class Iterator {
<<interface>>
+hasNext() boolean
+next() Object
}
class ConcreteIterator {
-collection: List
-cursor: int
+hasNext()
+next()
}
class Aggregate {
<<interface>>
+createIterator() Iterator
}
class ConcreteAggregate {
-items: List
+createIterator()
}
Aggregate <|-- ConcreteAggregate
Iterator <|-- ConcreteIterator
ConcreteAggregate --> ConcreteIterator

三、代码实现示例
场景:实现支持正序/逆序遍历的书籍集合
1. 书籍类与抽象迭代器
// 书籍类
public class Book {
private String name;
public Book(String name) { this.name = name; }
public String getName() { return name; }
}
// 抽象迭代器接口
public interface BookIterator {
boolean hasNext();
Book next();
}
2. 具体迭代器实现
// 正序迭代器
public class ForwardIterator implements BookIterator {
private List<Book> books;
private int index = 0;
public ForwardIterator(List<Book> books) {
this.books = books;
}
@Override
public boolean hasNext() {
return index < books.size();
}
@Override
public Book next() {
return books.get(index++);
}
}
// 逆序迭代器
public class ReverseIterator implements BookIterator {
private List<Book> books;
private int index;
public ReverseIterator(List<Book> books) {
this.books = books;
index = books.size() - 1;
}
@Override
public boolean hasNext() {
return index >= 0;
}
@Override
public Book next() {
return books.get(index--);
}
}
3. 聚合类与客户端调用
// 书籍集合(聚合类)
public class BookShelf implements Iterable<Book> {
private List<Book> books = new ArrayList<>();
public void addBook(Book book) {
books.add(book);
}
// 默认返回正序迭代器
@Override
public BookIterator iterator() {
return new ForwardIterator(books);
}
// 扩展方法返回逆序迭代器
public BookIterator reverseIterator() {
return new ReverseIterator(books);
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
BookShelf shelf = new BookShelf();
shelf.addBook(new Book("设计模式"));
shelf.addBook(new Book("算法导论"));
System.out.println("正序遍历:");
BookIterator it = shelf.iterator();
while (it.hasNext()) {
System.out.println(it.next().getName());
}
System.out.println("\n逆序遍历:");
BookIterator reverseIt = shelf.reverseIterator();
while (reverseIt.hasNext()) {
System.out.println(reverseIt.next().getName());
}
}
}
输出结果:
正序遍历:
设计模式
算法导论
逆序遍历:
算法导论
设计模式
四、工业级源码应用
- Java集合框架
java.util.Iterator接口与List.iterator()方法,如ArrayList.Itr内部类实现了正向遍历。
List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
- Spring Data分页查询
-
Page<T>接口的iterator()方法封装数据库分页结果遍历,隐藏JDBC游标细节。
- Android RecyclerView
-
RecyclerView.Adapter通过ViewHolder迭代器模式复用屏幕外的视图元素。
- Apache Commons Collections
-
FilterIterator支持条件过滤遍历,如筛选集合中大于特定值的元素。
- JUnit测试框架
-
TestSuite通过TestIterator遍历测试用例,支持多层级套件执行。
五、模式对比与选型建议
| 维度 | 迭代器模式 | 访问者模式 |
|---|---|---|
| 关注点 | 元素遍历 | 算法与数据结构分离 |
| 扩展方向 | 新增遍历方式(正序/逆序) | 新增元素类型的处理逻辑 |
| 典型场景 | 集合类遍历、文件系统遍历 | 编译器AST处理、报表生成 |
最佳实践:
- 优先使用语言内置迭代器(如Java的
for-each循环) - 复杂遍历场景扩展迭代器(如树形结构的广度优先遍历)
- 注意线程安全:多线程环境下需使用
ConcurrentModificationException机制或同步控制
总结
迭代器模式通过封装遍历逻辑与解耦数据结构,在Java集合框架、数据库访问等场景中展现出强大的普适性。其设计精髓在于将访问权与控制权分离,开发者应重点把控迭代器的扩展性与性能平衡,使其成为高复杂度数据处理的利器。

浙公网安备 33010602011771号