1. 迭代器模式基础概念
迭代器模式是一种行为型设计模式,它提供了一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。这个模式在日常开发中无处不在,比如我们常用的for...of循环、数组的forEach方法,底层都是迭代器模式的实现。
我第一次真正理解迭代器模式的价值是在处理一个商品列表分页的场景。当时需要从不同数据源(数据库、缓存、第三方API)获取商品数据,每个数据源返回的数据结构都不相同。如果直接在业务代码中处理这些差异,会导致代码臃肿且难以维护。通过引入迭代器模式,我们统一了数据访问接口,业务代码只需要通过统一的迭代器获取数据,完全不用关心数据来自哪里以及底层的数据结构。
迭代器模式的核心在于解耦集合对象的遍历行为。想象一下你去图书馆借书,你不需要知道图书是如何分类存放的(是按主题分类还是按作者姓氏排序),只需要告诉图书管理员你想要什么书,他就会按顺序把书找给你。这里的图书管理员就扮演着迭代器的角色。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 迭代器模式的结构与实现
2.1 模式角色解析
一个标准的迭代器模式通常包含以下角色:
- Iterator(迭代器接口):
定义访问和遍历元素的接口,通常包含hasNext()和next()方法。在TypeScript中可能这样定义:
typescript复制interface Iterator<T> {
hasNext(): boolean;
next(): T;
}
-
ConcreteIterator(具体迭代器):
实现迭代器接口,负责管理当前遍历的位置。比如数组迭代器会记录当前遍历到的索引位置。 -
Aggregate(聚合接口):
定义创建迭代器对象的接口。通常是一个createIterator()方法。 -
ConcreteAggregate(具体聚合):
实现创建迭代器的接口,返回一个与自身对应的具体迭代器实例。
2.2 TypeScript实现示例
让我们实现一个简单的书籍集合迭代器:
typescript复制// 书籍类
class Book {
constructor(public title: string, public author: string) {}
}
// 迭代器接口
interface BookIterator {
hasNext(): boolean;
next(): Book;
}
// 书籍集合
class BookCollection {
private books: Book[] = [];
addBook(book: Book) {
this.books.push(book);
}
createIterator(): BookIterator {
return new BookCollectionIterator(this.books);
}
}
// 具体迭代器实现
class BookCollectionIterator implements BookIterator {
private position: number = 0;
constructor(private books: Book[]) {}
hasNext(): boolean {
return this.position < this.books.length;
}
next(): Book {
return this.books[this.position++];
}
}
// 使用示例
const collection = new BookCollection();
collection.addBook(new Book("设计模式", "GoF"));
collection.addBook(new Book("代码整洁之道", "Robert C. Martin"));
const iterator = collection.createIterator();
while (iterator.hasNext()) {
const book = iterator.next();
console.log(`${book.title} - ${book.author}`);
}
这个例子展示了迭代器模式的基本实现方式。BookCollection是具体聚合类,它不关心遍历逻辑,只负责存储数据和创建迭代器。BookCollectionIterator则封装了遍历逻辑,客户端代码只需要通过迭代器接口操作,完全不需要知道书籍是如何存储的。
