跳到主要内容

迭代器模式

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。迭代器模式通过将迭代逻辑封装在一个独立的迭代器对象中,使得可以在不改变聚合对象的情况下,访问聚合对象的元素。

在迭代器模式中,有两个主要角色:

  1. 迭代器(Iterator): 定义了访问和遍历元素的接口。
  2. 具体迭代器(Concrete Iterator): 实现了迭代器接口,负责实现具体的迭代逻辑。

在许多编程语言中,迭代器模式已经被语言本身的迭代器和for...of等语法特性所取代,但仍然有些场景中需要自定义迭代器。

以下是一个简单的 JavaScript 示例:

// 迭代器接口
class Iterator {
constructor() {
if (this.constructor === Iterator) {
throw new Error('Iterator is an interface and should not be instantiated.');
}
}

next() {
throw new Error('next method must be implemented by concrete iterators.');
}

hasNext() {
throw new Error('hasNext method must be implemented by concrete iterators.');
}
}

// 具体迭代器
class ConcreteIterator extends Iterator {
constructor(collection) {
super();
this.collection = collection;
this.index = 0;
}

next() {
return this.collection[this.index++];
}

hasNext() {
return this.index < this.collection.length;
}
}

// 聚合对象
class Aggregate {
constructor() {
this.elements = [];
}

createIterator() {
return new ConcreteIterator(this.elements);
}
}

// 客户端代码
const aggregate = new Aggregate();
aggregate.elements = [1, 2, 3, 4, 5];

const iterator = aggregate.createIterator();

while (iterator.hasNext()) {
console.log(iterator.next());
}
// Output:
// 1
// 2
// 3
// 4
// 5

在这个例子中,Iterator 是迭代器接口,定义了 nexthasNext 方法。ConcreteIterator 是具体迭代器,实现了迭代器接口,负责实现具体的迭代逻辑。Aggregate 是聚合对象,它包含了一个元素集合,并提供了创建迭代器的方法。客户端代码通过迭代器遍历聚合对象的元素,而不必关心聚合对象的内部结构。