意圖:提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素, 而又無須暴露該對(duì)象的內(nèi)部表示。
迭代器模式是一種非常常見的設(shè)計(jì)模式,在我們的編程中,想要遍歷一個(gè)非常大的容器對(duì)象,往往要先把數(shù)據(jù)都裝進(jìn)容器,再使用for循環(huán)等等的方式;
但是很多情況下,這個(gè)容器大到普通的內(nèi)存都裝不下的時(shí)候,暴力的遍歷就行不通了;
而且,很多時(shí)候,這個(gè)容器里面的元素并不是直接能讀取的,有可能是從網(wǎng)絡(luò)讀取,有可能是讀文件,有可能是隨機(jī)生成,所以不能簡(jiǎn)單暴力的for循環(huán);
另外,如果這個(gè)容器到底有多少個(gè)元素也不清楚呢?也無法使用for循環(huán)這種方式;
這時(shí)候,迭代器模式就很有用,你不需要知道容器對(duì)象里有多少個(gè)元素,我只要告訴你,“還有沒有元素”就行了,一直到取完了,也就迭代完了。
代碼:
// 通用的迭代器接口
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())
}
輸出結(jié)果:
[LOG]: 1
[LOG]: 2
[LOG]: 3
[LOG]: 4
[LOG]: 5