TS设计模式之迭代器模式
·
关注大师不迷路,大师带你上高度~
前言
关注大师不迷路,大师带你上高度~
一、迭代器模式是什么?
迭代器模式是一种设计模式,它提供一种方法来顺序访问聚合对象中的各个元素,而又不暴露该对象的内部表示。
核心组成
Iterator(迭代器):如 DataIterator 类,负责管理遍历状态和提供 next()、hasNext() 方法
Container(容器):如 DataContainer 类,负责存储数据并提供获取迭代器的方法 getInterator()
注意:普通的for循环不是迭代器
二、使用步骤
1、迭代器详解
代码如下:
//普通的for循环不是迭代器
/**
* 迭代器的特点
* 1、顺序访问有序结构(如数组、NodeList)
* 2、不知道数据的长度和内部结构
* 3、高内聚、低耦合
*/
class DataIterator {
private data: number[]
private index = 0
constructor(constainer: DataContainer) {
this.data = constainer.data
}
next(): number | null {
if (this.hasNext()) {
return this.data[this.index++]
}
return null
}
hasNext(): boolean {
if (this.index >= this.data.length) return false
return true
}
}
class DataContainer {
data = [10, 20, 30, 40, 50]
getInterator() {
return new DataIterator(this)
}
}
const constainer = new DataContainer()
const interator = constainer.getInterator()
while (interator.hasNext()) {
const num = interator.next()
console.log(num);
}
2、应用场景
代码如下:
/**
* 1、有序结构
* 2、Symbol.iterator和迭代器js中所有的有序接口都内置Symbol.iterator
*/
// 自己模拟迭代器
interface InteratorRes {
value: number | undefined
done: boolean
}
class CustomInterator {
private length = 3
private index = 0
next(): InteratorRes {
this.index++
if (this.index <= this.length) {
return { value: undefined, done: true }
}
return { value: undefined, done: true }
}
// 在TypeScript(TS)类中,:ml-search[Symbol.iterator] { return this }的意思是该方法使得类的实例成为一个迭代器。
// 具体来说,它定义了一个默认的迭代器,当使用for...of循环或其他迭代器相关的操作时,会调用这个方法来获取迭代器对象。
[Symbol.iterator]() {
return this
}
}
const interator1 = new CustomInterator()
console.log(interator.next());
console.log(interator.next());
console.log(interator.next());
console.log(interator.next());
3、js中的for…of
代码如下:
interface InteratorRes {
value: number | undefined
done: boolean
}
class CustomInterator {
private length = 3
private index = 0
next(): InteratorRes {
this.index++
if (this.index <= this.length) {
return { value: undefined, done: true }
}
return { value: undefined, done: true }
}
// 在TypeScript(TS)类中,:ml-search[Symbol.iterator] { return this }的意思是该方法使得类的实例成为一个迭代器。
// 具体来说,它定义了一个默认的迭代器,当使用for...of循环或其他迭代器相关的操作时,会调用这个方法来获取迭代器对象。
[Symbol.iterator]() {
return this
}
}
const interator1 = new CustomInterator()
// 只要有内置的Symbol.iterator就可以用for...of遍历
for (const iterator of interator1) {
console.log(iterator);
}
4、数据解构也是通过迭代器完成的
代码如下:
const [n1, n2] = [10, 20, 20]
const [n3, n4] = interator1
const a1 = [...interator1]
// Array.from,可以将迭代器变成数组
//生成器就是arr[Symbol.Iterator]()
function* genNums() {
yield 10
yield 20
yield 30
}
const numInterator = genNums()
console.log(numInterator.next());
console.log(numInterator.next());
console.log(numInterator.next());
console.log(numInterator.next());
function* genNums1() {
yield* [10, 20, 30] //yield* 后面可以带一个有序结构
}
const numInterator1 = genNums1()
for (const iterator of numInterator1) {
console.log(iterator);
}
5、自己实现生成器
代码如下:
class CustomInterator1 {
private data: number[]
constructor() {
this.data = [10, 20, 30]
}
*[Symbol.iterator]() {
return this.data
}
}
const interator2 = new CustomInterator1()
for (const iterator of interator2) {
console.log(iterator);
}
应用场景
有序数据结构的遍历
生成器函数(Generator functions)自动实现迭代器协议
数据解构、… 扩展运算符、Array.from() 等操作都基于迭代器协议
迭代器模式让数据遍历变得更加统一和灵活,是现代编程语言中非常重要的设计模式之一。
总结
关注大师不迷路,大师带你上高度~
迭代器模式的特点
顺序访问有序结构:可以顺序访问像数组、NodeList等有序数据结构
隐藏内部结构:使用者不需要知道数据的具体长度和内部结构就能遍历数据
高内聚、低耦合:将遍历逻辑封装在独立的迭代器对象中
更多推荐



所有评论(0)