意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
迭代器模式是一种非常常见的设计模式,在我们的编程中,想要遍历一个非常大的容器对象,往往要先把数据都装进容器,再使用for循环等等的方式;
但是很多情况下,这个容器大到普通的内存都装不下的时候,暴力的遍历就行不通了;
而且,很多时候,这个容器里面的元素并不是直接能读取的,有可能是从网络读取,有可能是读文件,有可能是随机生成,所以不能简单暴力的for循环;
另外,如果这个容器到底有多少个元素也不清楚呢?也无法使用for循环这种方式;
这时候,迭代器模式就很有用,你不需要知道容器对象里有多少个元素,我只要告诉你,“还有没有元素”就行了,一直到取完了,也就迭代完了。
代码:
// 通用的迭代器接口
interface IIterator<T> {
hasNext: () => boolean
next: () => T
}
class ArrayContainer implements IIterator<any> {
private arr = [1, 2, 3, 4, 5]
private index = 0
public hasNext = () => {
return this.index <= this.arr.length - 1
}
public next = () => {
const e = this.arr[this.index]
this.index++
return e
}
}
// Test
const c = new ArrayContainer()
while(c.hasNext()) {
console.log(c.next())
}
输出结果:
[LOG]: 1
[LOG]: 2
[LOG]: 3
[LOG]: 4
[LOG]: 5