首页 > 编程语言 >【JS】166-JavaScript设计模式——迭代器模式

【JS】166-JavaScript设计模式——迭代器模式

时间:2022-10-13 15:35:04浏览次数:46  
标签:function index 聚合 迭代 JS JavaScript 模式 leo 设计模式

【JS】166-JavaScript设计模式——迭代器模式_迭代器

三、迭代器模式(Iterator Pattern)

1.概念介绍

迭代器模式(Iterator Pattern) 是提供一种方法,顺序访问一个聚合对象中每个元素,并且不暴露该对象内部。

这种模式属于行为型模式,有以下几个特点:

  • 访问一个聚合对象的内容,而无需暴露它的内部表示。
  • 提供统一接口来遍历不同结构的数据集合。
  • 遍历的同事更改迭代器所在的集合结构可能会导致问题。

在迭代器模式中,通常包含有一个包含某种数据集合的对象,需要提供一种简单的方法来访问每个元素。
这里对象需要提供一个 ​​​next()​​方法,每次调用都必须返回下一个连续的元素。

这里假设创建一个对象 ​​leo​​​,我们通过调用它的 ​​next()​​方法访问下一个连续的元素:

1. ​​let obj;​​
2. ​​while(obj = leo.next()){​​
3. ​​ // do something​​
4. ​​ console.log(obj);​​
5. ​​}​​

另外迭代器模式中,聚合对象还会提供一个更为渐变的 ​​hasNext()​​方法,来检查是否已经到达数据末尾,我们这么修改前面的代码:

1. ​​while(leo.hasNext()){​​
2. ​​ // do something​​
3. ​​ console.log(obj);​​
4. ​​}​​

2.优缺点和应用场景

2.1优点

  • 它简化了聚合类,并支持以不同的方式遍历一个聚合对象。
  • 在同一个聚合上可以有多个遍历。
  • 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

2.2缺点

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

2.3应用场景

  • 访问一个聚合对象的内容而无须暴露它的内部表示。
  • 需要为聚合对象提供多种遍历方式。
  • 为遍历不同的聚合结构提供一个统一的接口。

3.简单案例

根据上面的介绍,我们这里实现一个简单案例,将设我们数据只是普通数组,然后每次检索,返回的是间隔一个的数组元素(即不是连续返回):

然后我们还要给它提供更简单的访问方式和多次迭代数据的能力,我们需要添加下面两个方法:

1. let leo = (function(){​​
2. ​​ let index = 0, data = [1, 2, 3, 4, 5],​​
3. ​​ len = data.length;​​
4. ​​ return {​​
5. ​​ next: function(){​​
6. ​​ let obj;​​
7. ​​ if(!this.hasNext()){​​
8. ​​ return null;​​
9. ​​ };​​
10. ​​ obj = data[index];​​
11. ​​ index = index + 2;​​
12. ​​ return obj;​​
13. ​​ },​​
14. ​​ hasNext: function(){​​
15. ​​ return index < len;​​
16. ​​ }​​
17. ​​ }​​
18. ​​})()​​
  • ​rewind()​​ 重置指针到初始位置;
  • ​current()​​​ 返回当前元素,因为当指针步前进时无法使用 ​​next()​​操作;

代码变成这样:

这样这个案例就完整了,接下来我们来测试:

1. let leo = (function(){​​
2. ​​ //.. ​​
3. ​​ return {​​
4. ​​ // .. ​​
5. ​​ rewind: function(){​​
6. ​​ index = 0;​​
7. ​​ },​​
8. ​​ current: function(){​​
9. ​​ return data[index];​​
10. ​​ }​​
11. ​​ }​​
12. ​​})();​​
1. ​​// 读取记录​​
2. ​​while(leo.hasNext()){​​
3. ​​ console.log(leo.next());​​
4. ​​}; // 打印 1 3 5​​
5. ​​// 回退​​
6. ​​leo.rewind();​​
7. ​​// 获取当前​​
8. ​​console.log(leo.current()); // 回到初始位置,打印1​​

4.应用场景

迭代器模式通常用于:对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又响让客户代码透明底访问其中的元素,这种情况下我们可以使用迭代器模式。

简单理解:遍历一个聚合对象。

  • jQuery应用例子:

jQuery中的 ​​$.each()​​方法,可以让我们传入一个方法,实现对所有项的迭代操作:

1. ​​$.each([1,2,3,4,5],function(index, value){​​
2. ​​ console.log(`${index}: ${value}`)​​
3. ​​})​​
• 使用迭代器模式实现 ​​each()​​方法
4. ​​let myEach = function(arr, callback){​​
5. ​​ for(var i = 0; i< arr.length; i++){​​
6. ​​ callback(i, arr[i]);​​
7. ​​ }​​
8. ​​}​​

4.小结

迭代器模式是一种相对简单的模式,目前绝大多数语言都内置了迭代器。而且迭代器模式也是非常常用,有时候不经意就是用了。

参考资料

  1. 《JavaScript Patterns》

【JS】166-JavaScript设计模式——迭代器模式_迭代器_02

标签:function,index,聚合,迭代,JS,JavaScript,模式,leo,设计模式
From: https://blog.51cto.com/u_11887782/5753521

相关文章

  • 【JS】172-JavaScript设计模式——观察者模式
    九、观察者模式(ObserverPatterns)1.概念介绍观察者模式(ObserverPatterns) 也称订阅/发布(subscriber/publisher)模式,这种模式下,一个对象订阅定一个对象的特定活动,并在状......
  • 【JS】170-JavaScript设计模式——代理模式
    七、代理模式(ProxyPattern)1.概念介绍代理模式(ProxyPattern) 为其他对象提供一种代理,来控制这个对象的访问,代理是在客户端和真实对象之间的介质。简单的理解:如我们需要......
  • videojs播放直播
    index.html引入css和js<linkhref="https://cdn.bootcdn.net/ajax/libs/video.js/7.10.1/alt/video-js-cdn.min.css"rel="stylesheet"><scripttype="text/javascrip......
  • 【JS】222-JS 函数的 6 个基本术语
    英文:Martin Novák 译文:reahinkhttps://zhuanlan.zhihu.com/p/61868946让我们谈谈什么是:lambdas(匿名函数)、first-classfunctions(头等函数)、higher-orderfunctions(高阶......
  • 45. JS Ajax请求(简明教程)
    1.前言Ajax全称“AsynchronousJavaScriptandXML”,译为“异步JavaScript和XML”,程序员们习惯称之为“阿贾克斯”,它并不是一种技术,而是多种技术的综合体,其中包括Ja......
  • 46. JS类型转换(强制类型转换+隐式类型转换)
    1.前言JavaScript 中有五种基本数据类型(其中包括String、Number、Boolean、Function、Symbol)、三种对象类型(其中包括Object、Date、Array)和两种特殊类型(其中包括Nul......
  • 【JS】80-如何优雅处理前端异常?
    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。一、为什么要处理异常?异常是不可控的,会影响最终的呈现结果,但是我们......
  • 【JS】89-用JavaScript实现的5个常见函数
    前言    在学习 JavaScript,或者前端面试中,有人会问你节流函数、防抖函数、递归函数等,本文分享了5个常见函数,希望对你有所帮助。    在 JavaScript 中有一些问题......
  • js时间戳,获取日期的总毫秒值
    时间戳vardate=newDate();console.log(date.valueOf());//valueof返回对象的原始值,date对象的原始值就是毫秒console.log(date.getTime());//返回一个时间的格林威......
  • 【JS】11-前端HTML5几种存储方式的总结
    接下来要好好总结一些知识,秋招来啦。。。虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~总体情况h5之前,存储主要是用​​cookies​​​。​​cookies​​......