AI速览:迭代器模式通过提供统一接口(如hasNext()next())遍历集合元素,隐藏集合内部结构(如数组或链表),实现遍历与集合的解耦,常用于简化不同数据结构的访问逻辑(如Java集合框架),支持多种遍历方式,但可能增加简单场景的复杂度。核心思想是“无需关心集合细节,只管按需取用”。

设计模式:Iterator模式(迭代器模式)

什么是迭代器模式?

想象一下,你去图书馆借书,书架上摆满了不同类型的书籍。你不需要知道书架内部如何排列书籍,只需要问管理员“下一本是什么书?”就能依次拿到所有书。迭代器模式就是这个“管理员”——它帮你遍历集合对象中的元素,同时隐藏集合的内部结构(比如数组、链表),让遍历操作和集合本身解耦。


为什么需要它?

  • 统一遍历方式:无论集合是数组、链表还是树,调用next()就能拿到下一个元素。
  • 保护封装性:不需要暴露集合内部如何存储数据。
  • 支持多种遍历:比如正序遍历、逆序遍历,甚至按条件过滤遍历。

Java代码示例

假设我们有一个自定义的「书架」集合,存放多个「书」对象,用迭代器模式实现遍历:

1. 定义书对象(简单POJO)
1
2
3
4
5
public class Book {
private String name;
public Book(String name) { this.name = name; }
public String getName() { return name; }
}
2. 定义迭代器接口
1
2
3
4
public interface Iterator<T> {
boolean hasNext(); // 是否还有下一本书?
T next(); // 返回下一本书
}
3. 实现具体的书架迭代器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class BookShelfIterator implements Iterator<Book> {
private Book[] books;
private int index = 0;

public BookShelfIterator(Book[] books) {
this.books = books;
}

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

@Override
public Book next() {
return books[index++];
}
}
4. 定义集合接口(可迭代的)
1
2
3
public interface IterableCollection {
Iterator<Book> createIterator(); // 返回一个迭代器
}
5. 实现具体的书架集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BookShelf implements IterableCollection {
private Book[] books;
private int size = 0;

public BookShelf(int capacity) {
books = new Book[capacity];
}

public void addBook(Book book) {
if (size < books.length) {
books[size++] = book;
}
}

@Override
public Iterator<Book> createIterator() {
return new BookShelfIterator(books); // 关键:返回迭代器
}
}
6. 客户端使用
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
BookShelf shelf = new BookShelf(3);
shelf.addBook(new Book("设计模式"));
shelf.addBook(new Book("Java核心编程"));
shelf.addBook(new Book("算法导论"));

Iterator<Book> iterator = shelf.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getName());
}
}
}

迭代器模式的核心

  • Iterator接口:定义遍历的通用方法(如hasNext()next())。
  • IterableCollection接口:声明集合能生成迭代器。
  • 解耦:客户端只依赖迭代器接口,不关心集合内部结构。

实际应用

  • Java集合框架中的 java.util.Iterator(比如遍历ArrayListHashSet)。
  • 数据库查询结果集的遍历。
  • 树形结构(如二叉树)的深度优先或广度优先遍历。

优缺点

优点

  • 符合单一职责原则(集合管理数据,迭代器负责遍历)。
  • 支持以不同方式遍历同一个集合。

缺点

  • 对于简单集合(如数组)可能略显繁琐。
  • 迭代器需要维护遍历状态(如当前索引),可能增加内存开销。

一句话总结

迭代器模式是“不操心的遍历”——你只管问“还有吗?”,剩下的交给它!