迭代器模式
大约 3 分钟
为什么要使用迭代器模式
迭代器模式提供了一种方法来顺序访问集合中的元素,而无需暴露其底层表示。使用迭代器模式有以下几个优点:
- 简化代码:迭代器模式将遍历逻辑封装在迭代器对象中,使得客户端代码更加简洁和易读。
- 解耦集合和遍历:集合对象和遍历算法分离,增加了代码的灵活性和可维护性。可以在不修改集合对象的情况下,改变遍历算法。
- 统一接口:通过实现统一的迭代器接口,不同类型的集合可以使用相同的遍历方式,增强了代码的可扩展性。
- 支持多种遍历方式:可以根据需要实现不同的迭代器,以支持多种遍历方式,如正向遍历、反向遍历、过滤遍历等。
通过使用迭代器模式,我们可以更好地管理和操作集合数据,提高代码的可读性和可维护性。
TypeScript 实现迭代器模式
在本节中,我们将展示如何使用 TypeScript 实现迭代器模式。迭代器模式是一种行为设计模式,它允许顺序访问集合中的元素,而无需暴露其底层表示。
代码示例
以下是实现迭代器模式的 TypeScript 代码示例:
// aggregate.ts
import { Iterator } from './iterator';
export interface Aggregate {
iterator(): Iterator;
}
// book.ts
export class Book {
private name: string;
constructor(name: string) {
this.name = name;
}
getName(): string {
return this.name;
}
}
// bookShelf.ts
import { Book } from './book';
import { Iterator } from './iterator';
import { BookShelfIterator } from './bookShelfIterator';
import { Aggregate } from './aggregate';
export class BookShelf implements Aggregate {
private books: Book[];
private last: number = 0;
constructor() {
this.books = [];
}
getBookAt(index: number): Book {
return this.books[index];
}
appendBook(book: Book): void {
this.books[this.last] = book;
this.last++;
}
getLength(): number {
return this.last;
}
iterator(): Iterator {
return new BookShelfIterator(this);
}
}
// bookShelfIterator.ts
import { BookShelf } from './bookShelf';
import { Iterator } from './iterator';
export class BookShelfIterator implements Iterator {
private bookShelf: BookShelf;
private index: number;
constructor(bookShelf: BookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
hasNext(): boolean {
return this.index < this.bookShelf.getLength();
}
next(): any {
const book = this.bookShelf.getBookAt(this.index);
this.index++;
return book;
}
}
// iterator.ts
export interface Iterator {
hasNext(): boolean;
next(): any;
}
// main.ts
import { BookShelf } from "../bookShelf";
import { Book } from "../book";
const bookShelf = new BookShelf();
bookShelf.appendBook(new Book("Around the World in 80 Days"));
bookShelf.appendBook(new Book("Bible"));
bookShelf.appendBook(new Book("Cinderella"));
bookShelf.appendBook(new Book("Daddy-Long-Legs"));
const it = bookShelf.iterator();
while (it.hasNext()) {
const book = it.next();
console.log(book.getName());
}
运行结果
PS design_patern> ts-node "d:\code\design_patern\src\iterator\main.ts"
Around the World in 80 Days
Bible
Cinderella
Daddy-Long-Legs
在上面的代码中,我们定义了几个类和接口来实现迭代器模式:
Iterator
接口定义了hasNext
和next
方法。Aggregate
接口定义了iterator
方法。Book
类表示一个书籍对象。BookShelf
类表示一个书架,它实现了Aggregate
接口。BookShelfIterator
类实现了Iterator
接口,用于遍历BookShelf
中的书籍。
通过这些类和接口,我们可以轻松地遍历 BookShelf
中的书籍,而无需了解其内部实现细节。
多个迭代器
在某些情况下,我们可能需要为同一个集合编写多个具体迭代器(ConcreteIterator)。例如,我们可以为 BookShelf
编写一个反向迭代器,以便从后向前遍历书籍。
相关的设计模式
- Visitor 模式
- Composite 模式
- Factory Method 模式