设计模式-迭代器模式

介绍

  • 顺序访问一个集合
  • 使用者无需知道集合的内部结构(封装)

示例

  • 常用的jQuery演示
<p>jquery each</p>
<p>jquery each</p>
<p>jquery each</p><script>
var arr = [1,2,3]
var nodeList = document.getElementsByTagName('p')
var $p = $('p')// 要对这三个变量进行遍历,需要写三个遍历方法
// 第一
arr.forEach(function(item){console.log(item)
})// 第二
var i, length = nodeList.length
for(i = 0; i < length; i++) {console.log(nodeList[i])
}// 第三
$p.each(function (key, p){console.log(key, p)
})function each(data) {var $data = $(data)$data.each(function (key, val){console.log(key, val)})
}
each(arr)
each(nodeList)
each($a)
</script>

UML类图

  • 传统UML类图
    传统UML类图
  • 简化UML类图
    简化简化UML类图UML类图

代码演示

class Iterator {constructor(container) {this.list = container.listthis.index = 0}next() {if (this.hasNext()) {return this.list[this.index++]}return null}hasNext() {if (this.index >= this.list.length) {return false}return true}
}
class Container {constructor(list) {this.list = list}// 生成遍历器getIterator() {return new Iterator(this)}
}let arr = [1, 2, 3, 4, 5, 6]
let container = new Container(arr)
let iterator = container.getIterator()
while(iterator.hasNext()) {console.log(iterator.next())
}

场景

  • jQuery each
  • ES6 Iterator

ES6 Iterator为何存在?

  • ES6语法中,有序集合的数据类型已经有很多
  • Array Map Set String TypedArray arguments NodeList
  • 需要有一个统一的遍历接口来遍历所有数据类型
  • (注意,object不是有序集合,可以用Map代替)

ES6 Iterator是什么?

  • 以上数据类型,都有[Symbol.iterator]属性
  • 属性值是函数,执行函数返回一个迭代器
  • 这个迭代器就有next方法可顺序迭代子元素
  • 可运行Array.prototype[Symbol.iterator]来测试

ES6 Iterator示例

function each(data) {// 生成迭代器let iterator = data[Symbol.iterator]()console.log(iterator.next()) // 有数据时返回 { value: 1, done: false }let item = {done: false}while (!item.done) {item = iterator.next()if (!item.done) {console.log(item.value)}}
}

测试代码

let arr = [1, 2, 3, 4]
let nodeList = document.getElementByTagName('p')
let m = new Map()
m.set('a', 100)
m.set('b', 200)each(arr)
each(arr)
each(m)
// `Symbol.iterator`并不是人人都知道
// 也不是每个人都需要封装一个each方法
// 因此有了 `for...of`语法
function each(data) {for (let item of data) {console.log(item)}
}each(arr)
each(nodeList)
each(m)// for of 遍历迭代器
// for in 遍历对象

ES6 Iterator 与 Generator

  • Iterator的价值不限于上述几个类型的遍历
  • 还有Generator函数的使用
  • 即只要返回的数据符合Iterator接口的要求
  • 即可使用Iterator语法,这就是迭代器模式

设计原则验证

  • 迭代器对象和目标对象分离
  • 迭代器将使用者与目标对象隔离开
  • 符合开放封闭原则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142587.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】LODGroup 计算公式

Unity 在配置 LodGroup 时&#xff0c;其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时&#xff0c;如果相机视野范围&#xff08;Field of View&#xff09;没有改变&#xff0c;那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到…

Jmeter——循环控制器中实现Counter计数器的次数重置

近期在使用Jmeter编写个辅助测试的脚本&#xff0c;用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值&#xff0c;使用循环实现&#xff1b;但第三个可变值的数量次数&#xff0c;是基于第二次循环中得到的结果才能确认最终次数&#xff0c;每次的结果…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

AI指令百科全书:1000条AI指令,一次性全给你!

这是一位&#xff0c;国外博主哈桑 整理的&#xff0c;1000条ChatGPT实用指令&#xff0c;涵盖目前几乎所有的&#xff0c;主流提示需求。 全文超过40000字。 我把它们翻译成更适合大家理解的「中文版Prompt」&#xff0c;并根据具体的内容&#xff0c;拆解成一二级目录&…

Serlet API详解

目录 一、HttpServlet 1.1 处理doGet请求 1.2 处理doPost请求 二、HttpServletRequest 2.1 核心方法 三、HttpServletRespons 3.1 核心方法 一、HttpServlet 在编写Servlet代码的时候&#xff0c;首先第一步要做的就是继承HttpServlet类&#xff0c;并重写其中的某些方法 核心…

基于边缘智能网关的储充一体电站管理方案

在“2030碳达峰&#xff0c;2060碳中和”的目标下&#xff0c;我国持续加快推进能源转型&#xff0c;扩大新能源占比&#xff0c;全国各地都在部署建设光伏、储能、新能源汽车充电等应用。随着新能源汽车的广泛普及&#xff0c;充电站、充电桩的需求快速增加&#xff0c;行业也…

瑞芯微RK3568:Debian系统如何安装Docker

本文基于HD-RK3568-IOT评估板演示Debian系统安装Docker&#xff0c;该方法适用于RK356X全系产品。 HD-RK3568-IOT评估板基于HD-RK3568-CORE 工业级核心板设计&#xff08;双网口、双CAN、5路串口&#xff09;&#xff0c;接口丰富&#xff0c;适用于工业现场应用需求&#xff…

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统&#xff08;SVN和Git&#xff09;&#xff1a; 集中式版本控制系统&#xff08;SVN&#xff09; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

基于VR元宇宙技术搭建林业生态模拟仿真教学系统

随着科技的飞速发展&#xff0c;教学方式也正在经历着巨大的变革。林业经济学元宇宙虚拟教学系统作为一种新兴的教学方式&#xff0c;为学生和教师提供了一个全新的、沉浸式的学习和教学环境。 森林管理和监测 元宇宙技术可以用于森林管理和监测。通过无人机、传感器和虚拟现实…

JavaScript的Web Worker

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript的Web Worker⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量…

Goby 漏洞发布|Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞(CVE-2019-5434)

漏洞名称&#xff1a;Revive Adserver 广告管理系统 adxmlrpc.php 文件远程代码执行漏洞&#xff08;CVE-2019-5434&#xff09; English Name&#xff1a; Revive Adserver adxmlrpc.php Remote Code Execution Vulnerability (CVE-2019-5434) CVSS core: 9.0 影响资产数&a…

网络通信(套接字通信)(C/C++)

1.网络编程必知概念 1.广域网和局域网 广域网:又称外网、公网。是连接不同地区局域网或城域网进行计算机通信的远程公共网络。 局域网:在一定的通信范围内,有很个多计算机组成的私有网络就叫局域网。(这些计算机相互之间是可以通信的,但是不能直接访问外网(可以通过网线…

帆软单元格插入斜线,左右两侧的文字显示不出来问题

服务器展示文字不出来的问题&#xff1a; 可能是版本问题&#xff0c;目前解决方式&#xff1a;把字体改成“宋体”&#xff0c;文字就出来了。

Spring | 事件监听器应用与最佳实践

引言 在复杂的软件开发环境中&#xff0c;组件之间的通信和信息交流显得尤为重要。Spring框架&#xff0c;作为Java世界中最受欢迎的开发框架之一&#xff0c;提供了一种强大的事件监听器模型&#xff0c;使得组件间的通信变得更加灵活和解耦。本文主要探讨Spring事件监听器的…

支撑电动汽车规模化,特来电智能化升级群充产品

9月26日&#xff0c;中国领先的充电网生态运营商特来电重磅发布智能群充4.0产品&#xff0c;标志着特来电群充产品体系进一步升级&#xff0c;充电行业迎来更高质量、更高性能的设备与系统&#xff0c;充电网基础设施将更好地支撑大规模电动汽车的发展。 群充技术路线引领充电…

[密码学入门]仿射密码(Affine)

加密算法y(axb)mod N 解密算法x*(y-b)mod N(此处的为a关于N的乘法逆元&#xff0c;不是幂的概念&#xff09; 如何求&#xff0c;涉及的知识挺多&#xff0c;还没想好怎么写&#xff0c;丢番图方程&#xff0c;贝祖定理&#xff08;又译裴蜀定理&#xff09;&#xff0c;扩展欧…

【Linux进行时】环境变量and进程优先级

1.环境变量 ❓首先一个问题&#xff1a;我写的代码&#xff08;这个代码很简单&#xff0c;不用管&#xff09;编译之后运行的时候为什么要带./ &#xff1f; 或者说我怎么才可以让我不用带./ &#xff1f; &#x1f4a1;.代表当前文件下&#xff0c;/是文件分隔符&#xff0c;…

数据库管理-第107期 Relocating PDB(20230927)

数据库管理-第107期 Relocating PDB&#xff08;20230927&#xff09; 在我长期的blog生涯&#xff0c;当需要迁移PDB的时候&#xff0c;出现了几种方式&#xff0c;基本上就是在线克隆或者datapump&#xff0c;然而这两种方式都需要一定的停机时间。在数据库版本一致的情况下…

MySQL - group by分组查询 (查询操作 三)

功能介绍 group by: 对数据进行分组和聚合操作(可以操作单字段和多字段) having&#xff1a;过滤group by的结果&#xff0c;也就是在分组后添加筛选条件 基础语法 select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having ]; where 和 having的区…

8个最受欢迎的可3D打印Minecraft模型

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 《我的世界》最令人兴奋的方面之一是其独特的视觉风格及其包含的所有细节。 市场上摆满了《我的世界》玩偶、乐高积木和其他玩具。如果你有 3D 打印机&#xff0c;则可以通过下载并 3D 打印这 8 种有趣的设计来激发你对 Mi…