跳转到内容

迭代器模式

首发于:2022-04-07

基本概念

迭代器模式 (Iterator Pattern)用于顺序地访问聚合对象内部的元素,又无需知道对象内部结构。使用了迭代器之后,使用者不需要关心对象的内部构造,就可以按序访问其中的每个元素。

现实生活中的例子

银行里的点钞机就是一个迭代器,放入点钞机的钞票里有不同版次的人民币,每张钞票的冠字号也不一样,但当一沓钞票被放入点钞机中,使用者并不关心这些差别,只关心钞票的数量,以及是否有假币。

应用场景

  1. 访问一个聚合对象的内容而无须暴露它的内部表示

  2. 需要为聚合对象提供多种遍历方式

  3. 为遍历不同的聚合结构提供一个统一的接口。

优缺点

优点:

  1. 它支持以不同的方式遍历一个聚合对象

  2. 迭代器简化了聚合类

  3. 在同一个聚合上可以有多个遍历

  4. 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码

缺点:

  1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

实现

随着 JavaScript 的 ECMAScript 标准每年的发展,给越来越多好用的 API 提供了支持,比如 Array 上的 filterforEachreduceflat 等,还有 Map、Set、String 等数据结构,也提供了原生的迭代器支持。

ES6 中,默认的迭代器部署在对应数据结构的 Symbol.iterator 属性上,如果一个数据结构具有 Symbol.iterator 属性,就被视为可遍历的,就可以用 for...of 循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator 方法。

for-of 循环可以使用的范围包括 Array、Set、Map 结构、上文提到的类数组结构、Generator 对象,以及字符串。

js
const foo = [1, 2, 3];

for (const key of foo) {
    console.log(key)
}

迭代器模式早已融入我们的日常开发中,在使用 filterreducemap 等方法的时候,不要忘记这些便捷的方法就是迭代器模式的应用。当我们使用迭代器方法处理一个对象时,我们可以关注与处理的逻辑,而不必关心对象的内部结构,侧面将对象内部结构和使用者之间解耦,也使得代码中的循环结构变得紧凑而优美。

京ICP备18043750号