迭代器模式
适合阅读本专栏的人群包括:
- 想提升代码质量和架构思维的 Java 开发者
- 在工作中面对复杂业务、代码难以维护的工程师
- 想准备面试、系统复习设计模式知识的同学
阅读完本专栏,你将掌握:
- 23 种设计模式的结构、适用场景和最佳实践
- 面向对象六大设计原则的使用方式
- 如何用设计模式解决常见业务场景问题
- 如何重构低质量代码,提升扩展性与可维护性
任何问题都可以在留言区指出,作者看到后会第一时间回复。
概念总是生僻的,可以结合代码多体会多练习。
如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。
其他模式详解:设计模式入门
迭代器 模式(Iterator Pattern)是一种行为 设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。迭代器模式常用于遍历集合类的对象,比如列表、数组等。
适用场景
- 需要访问集合对象的内容,但不想暴露其内部结构
- 需要提供多种遍历方式
- 遍历集合的操作可能变化,但集合本身稳定
迭代器模式的结构
-
迭代器接口(Iterator):定义访问和遍历元素的接口。
-
具体迭代器(ConcreteIterator):实现迭代器接口,并保持对集合中当前元素的跟踪。
-
聚合接口(Aggregate):定义创建迭代器对象的接口。
-
具体聚合(ConcreteAggregate):实现聚合接口,返回一个具体迭代器的实例。

代码示例
以下是一个 Java 实现的迭代器模式示例。
我们将创建一个简单的书架类和一个用于遍历书架的迭代器。
java
import java.util.ArrayList;
import java.util.List;
// 迭代器接口
interface Iterator<T> {
boolean hasNext();
T next();
}
// 聚合接口
interface Aggregate<T> {
Iterator<T> createIterator();
}
// 具体聚合类:书架
class BookShelf implements Aggregate<Book> {
private List<Book> books;
public BookShelf() {
this.books = new ArrayList<>();
}
public void addBook(Book book) {
books.add(book);
}
public Book getBookAt(int index) {
return books.get(index);
}
public int getLength() {
return books.size();
}
@Override
public Iterator<Book> createIterator() {
return new BookShelfIterator(this);
}
}
// 具体迭代器类:书架迭代器
class BookShelfIterator implements Iterator<Book> {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
return index < bookShelf.getLength();
}
@Override
public Book next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
// 简单的书类
class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 客户端
public class IteratorPatternDemo {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf();
bookShelf.addBook(new Book("Design Patterns"));
bookShelf.addBook(new Book("Refactoring"));
bookShelf.addBook(new Book("Clean Code"));
Iterator<Book> iterator = bookShelf.createIterator();
while (iterator.hasNext()) {
Book book = iterator.next();
System.out.println("Book: " + book.getName());
}
}
}
总结
相信小伙伴们看到 IteratorPatternDemo 客户端在使用 iterator 对象遍历时就很有感触了。
总之,当你需要遍历一个集合对象,但不想暴露其内部结构,或者希望提供多种遍历方式、统一遍历接口时,就可以使用迭代器模式。