行为型:迭代器模式

行为,迭代,模式 · 浏览次数 : 138

小编点评

**迭代器模式**是一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 **四种数据结构各自有着自己的内部实现,但对于使用者,我们希望以同样的一套规则去遍历它们,所以ES6在推出新数据结构的同时也推出了一套统一的接口机制——**迭代器**。 **迭代器**接口定义了一个名为 `next()` 的方法,该方法会返回当前节点的值并标志该节点是否已经访问完毕。使用迭代器可以迭代任何支持迭代的 JavaScript 数据结构,例如: * **Array** * **Map** * **Set** * **String** * **TypedArray** * **函数** **模拟实现迭代器** ```javascript function iteratorGenerator(list) { let idx = 0; return { next: function() { let done = idx > len; if (done) { return { done: done, value: list[idx++] }; } else { return { done: false }; } } }; } let iterator = iteratorGenerator(['1号选手', '2号选手', '3号选手']); // 打印每个节点的值 for (let item of iterator) { console.log(item.value); } ``` **总结** 迭代器模式是一种非常有效的方法,可以轻松地遍历各种 JavaScript 数据结构。通过使用迭代器,我们可以避免暴露数据结构的内部表示,同时可以保持代码易读和易维护。

正文

定义

  迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式它主要是用来解决遍历问题。

es6 中的迭代器

  JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有着自己的内部实现,但对于使用者,我们希望以同样的一套规则去遍历它们,所以ES6在推出新数据结构的同时也推出了一套统一的接口机制——迭代器(Iterator)

  es6 中统一了迭代器迭代接口,任何数据结构只要具备Symbol.iterator属性(这个属性就是Iterator的具体实现,它本质上是当前数据结构默认的迭代器生成函数),就可以被遍历,确切的说是被for...of...循环和迭代器的next方法遍历,for...of...的背后正是对next方法的反复调用。

  在ES6中,针对Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象这些原生的数据结构都可以通过for...of...进行遍历。

模拟实现迭代器

  迭代就是不断的去拿下一个值的一个过程,以及遍历完的状态,是否完成遍历。

闭包写法

// 定义生成器函数,入参是任意集合
function iteratorGenerator(list) {
    // idx记录当前访问的索引
    let idx = 0
    // len记录传入集合的长度
    let len = list.length
    return {
        // 自定义next方法
        next: function() {
            // 如果索引还没有超出集合长度,done为false
            let done = idx >= len
            // 如果done为false,则可以继续取值
            let value = !done ? list[idx++] : undefined
            
            // 将当前值与遍历是否完毕(done)返回
            return {
                done: done,
                value: value
            }
        }
    }
}

let iterator = iteratorGenerator(['1号选手', '2号选手', '3号选手'])
iterator.next()
iterator.next()
iterator.next()

generator 写法

在es6 中生成器函数 function * xxx 可以返回生成器对象( Generator 对象由生成器函数返回并且它符合可迭代协议迭代器协议。)

生成器函数在执行时能暂停,后面又能从暂停处继续执行。

// 生成器函数写法
function* iteratorGenerator1(list) {
    yield '生成器函数,我是1号'
    yield '生成器函数,我是2号'
    yield '生成器函数,我是3号'
}

let iterator1 = iteratorGenerator1()
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())

// 生成器函数写法--优化
function* iteratorGenerator2(list) {
    let index = 0, len = list.length;
    while (index <= len - 1) {
        
        yield list[index]
        index++
    }
   
}

let iterator2 = iteratorGenerator2(['生成器函数优化,我是1号', '生成器函数优化,我是2号', '生成器函数优化,我说3号'])
console.log(iterator2.next())
console.log(iterator2.next())
console.log(iterator2.next())

小结

可迭代协议:具备Symbol.iterator

迭代器协议:一个类似这个结构的对象:

{
	next: function () {
 	 return {
   		value: 'xx', // 当前遍历节点的值
   		done: false  // 是否完成遍历
    }
  }
}

 

与行为型:迭代器模式相似的内容:

行为型:迭代器模式

定义 迭代器模式提供一种方法按顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式是目的性极强的模式,它主要是用来解决遍历问题。 es6 中的迭代器 JS原生的集合类型数据结构,有Array(数组)和Object(对象),在ES6中,又新增了Map和Set。四种数据结构各自有着自

软件设计模式系列之十八——迭代器模式

迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。

设计模式学习(十八):迭代器模式

设计模式学习(十八):迭代器模式 作者:Grey 原文地址: 博客园:设计模式学习(十八):迭代器模式 CSDN:设计模式学习(十八):迭代器模式 迭代器模式 迭代器模式是一种行为型模式。 迭代器最典型的应用是容器遍历 模仿 JDK 的容器,我们自定义一个容器并实现 iterator 方法; 首先,

再谈23种设计模式(3):行为型模式(学习笔记)

行为型模式的关注点在于对象之间的通信和职责分配(描述结构模型中对象的动态特征)。行为型模式关注的是对象之间的交云和协作,即它们是如何相互作用的,以及如何分配职责和算法来完成任务。

行为型:策略模式

定义 定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。 算法:就是写的逻辑可以是你任何一个功能函数的逻辑 封装:就是把某一功能点对应的逻辑给抽出来 可替换:建立在封装的基础上,这些独立的算法可以很方便的替换 通俗的理解就是,把你的算法(逻辑)封装到不同的策略中,在不同的策略中是互相独

行为型:观察者模式

定义 观察者模式属于行为型模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。 一种一对多的关系中一称为被观察者也叫目标对象Subject而多则称为观察者对象Observer 观察者模式中通常有两个模型,一个观察者(observer)和

行为型:发布订阅模式

定义 发布订阅模式是基于一个事件(主题)通道,希望接收通知的对象Subscriber (订阅者)通过自定义事件订阅主题,被激活事件的对象 Publisher (发布者)通过发布主题事件的方式通知订阅者 Subscriber (订阅者)对象。 简单说就是发布者与订阅者通过事件来通信,这里的发布者是之前

软件设计模式系列之二十二——状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,使得对象的行为看起来像是改变了其类。状态模式将对象的状态抽象成一个独立的类,让对象在不同状态下具有不同的行为,而且可以在运行时切换状态。这种方式使得状态的管理更加清晰,避免了大量的条件判断语句,提高了代码的可维护性和可扩展性。

软件设计模式系列之二十——备忘录模式

备忘录模式是一种行为型设计模式,它允许我们在不暴露对象内部细节的情况下捕获和恢复对象的内部状态。这个模式非常有用,因为它可以帮助我们实现撤销、恢复和历史记录等功能。在本文中,我们将深入探讨备忘录模式的各个方面,包括定义、示例、结构、实现步骤、代码实现、典型应用场景、优缺点、类似模式以及小结。

软件设计模式系列之十七——解释器模式

解释器模式是一种行为型设计模式,它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则,并使用解释器来解释和执行这些规则,将复杂的语言转换为对象的操作。 在软件开发中,解释器模式常用于处理类似于编程语言、查询语言、正则表达式等需要解释和执行的场景。它将一个复杂的语言分解为一系列简单的规则,...