TypeScript 设计模式之【迭代器模式】

news2024/11/18 20:33:49

文章目录

  • 迭代器模式:优雅遍历集合的智能书签
  • 迭代器模式的奥秘
    • 迭代器模式有什么利与弊?
    • 如何使用迭代器模式来优化你的数据遍历
    • 代码实现案例
    • 迭代器模式的主要优点
    • 迭代器模式的主要缺点
    • 迭代器模式的适用场景
    • 总结

在这里插入图片描述

迭代器模式:优雅遍历集合的智能书签

你是否曾经在阅读一本厚重的书籍时,希望能够轻松地在不同章节之间跳转,而不用担心丢失阅读进度? 迭代器模式就像是一个智能书签,它能够帮助你优雅地遍历各种复杂的数据集合,无需关心其内部结构。

迭代器这个神奇的书签,它不仅能记住你的阅读位置,还能根据你的需求,帮你在不同的卷册、章节之间自如地穿梭,让你的阅读体验变得轻松愉快!

迭代器模式的奥秘

迭代器模式提供了一种方法,让你能够依次访问一个集合对象中的各个元素,而无需暴露该对象的内部表示。它就像是一个智能导览系统,为你提供了一种统一的方式来遍历不同类型的集合,无论是数组、链表还是树形结构。

迭代器模式有什么利与弊?

迭代器模式的优点是它简化了集合的遍历过程,提供了一种标准的访问集合元素的方法,使得客户端代码更加简洁。它还支持不同的遍历算法,增强了灵活性。缺点是对于简单的集合,使用迭代器会增加不必要的复杂性。

如何使用迭代器模式来优化你的数据遍历

迭代器涉及角色

  • 迭代器(Iterator): 定义访问和遍历元素的接口
  • 具体迭代器(ConcreteIterator): 实现迭代器接口,完成集合元素的遍历
  • 集合(Aggregate): 定义创建迭代器对象的接口
  • 具体集合(ConcreteAggregate): 实现集合接口,返回一个具体迭代器的实例

迭代器步骤

  1. 创建一个迭代器接口,定义遍历元素的方法
  2. 创建具体迭代器类,实现迭代器接口
  3. 创建集合接口,定义获取迭代器的方法
  4. 创建具体集合类,实现集合接口
  5. 使用迭代器遍历集合元素

选择合适的迭代器模式,你就能轻松地遍历各种复杂的数据结构,让代码变得更加简洁和灵活!

代码实现案例

// 迭代器接口
interface Iterator<T> {
  // 是否还有下一个元素
  hasNext(): boolean;
  // 获取下一个元素
  nextElement(): T;
}

// 集合接口
interface Aggregate<T> {
  // 创建迭代器
  createIterator(): Iterator<T>;
}

// 书签迭代器
class BookIterator implements Iterator<string> {
  // 书架
  private collection: string[];
  // 当前位置
  private position: number = 0;

  constructor(collection: string[]) {
    this.collection = collection;
  }
  // 是否有下一个页
  public hasNext(): boolean {
    return this.position < this.collection.length;
  }
  // 获取下一页
  public nextElement(): string {
    const result = this.collection[this.position];
    this.position++;
    return result;
  }
}

// 书架
class BookShelf implements Aggregate<string> {
  private books: string[] = [];
  // 添加书
  public addBook(book: string): void {
    this.books.push(book);
  }
  // 创建迭代器
  public createIterator(): Iterator<string> {
    return new BookIterator(this.books);
  }
}

// 客户端代码
function clientCode(aggregate: Aggregate<string>) {
  // 创建迭代器
  const iterator = aggregate.createIterator();
  console.log("遍历书架中的图书:");
  // 遍历书架
  while (iterator.hasNext()) {
    console.log(iterator.nextElement());
  }
}

// 创建书架并添加图书
const bookShelf = new BookShelf();
bookShelf.addBook("《设计模式》");
bookShelf.addBook("《重构》");
bookShelf.addBook("《代码整洁之道》");
bookShelf.addBook("《JavaScript高级程序设计》");

// 使用迭代器遍历书架
clientCode(bookShelf);

// 输出
// 遍历书架中的图书:
// 《设计模式》
// 《重构》
// 《代码整洁之道》
// 《JavaScript高级程序设计》

在这里插入图片描述

迭代器模式的主要优点

  1. 简化客户端代码: 客户端无需了解集合的内部结构,就能遍历元素
  2. 支持多种遍历方式: 根据需求实现不同的迭代器
  3. 符合单一职责原则: 将遍历责任从集合中分离出来
  4. 增强灵活性: 在不改变集合的情况下,增加新的遍历方式

迭代器模式的主要缺点

  1. 对于简单集合可能过度设计: 增加了系统的复杂性
  2. 可能导致类的数量增加: 每个集合可能需要一个对应的迭代器类
  3. 对于频繁修改的集合,迭代器可能变得无效: 需要额外的机制来处理并发修改

迭代器模式的适用场景

  1. 访问一个集合对象的内容,而不暴露其内部表示
  2. 为集合提供多种遍历方式
  3. 为不同的集合提供一个统一的遍历接口

总结

迭代器模式是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。迭代器模式使得我们可以轻松地遍历各种复杂的数据结构,而无需了解其内部实现细节。合理使用迭代器模式,可以让你的代码更加简洁、灵活,并且更易于维护和扩展。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告: TypeScript 设计模式之【中介者模式】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维工具之adb命令安装和使用

一、adb命令简介 ADB&#xff08;Android Debug Bridge&#xff09;是 Android 开发者工具包中的一个命令行工具&#xff0c;主要用于在开发、调试和测试 Android 应用时与 Android 设备进行交互。通过 ADB 工具&#xff0c;开发者和用户可以从电脑对 Android 设备执行各种操作…

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【递归】5.leetcode 872 叶子相似的树

1 题目描述 题目链接&#xff1a;叶子相似的树 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关…

Swoole的多进程模块

Swoole是有自己的一个进程管理模块&#xff0c;用来替代PHP的pcntl扩展&#xff0c;需要注意Process进程在系统是非常昂贵的资源&#xff0c;创建进程消耗很大&#xff0c;另外创建的进程过多会导致进程切换开销大幅上升。 为什么不使用pcntl 1.pcntl没有提供进程间通信的功能…

AI智能眼镜_带摄像头的AI智能眼镜,AI大模型落地的载体

随着科技的迅猛发展&#xff0c;AI智能眼镜汇聚了众多硬件的优势&#xff0c;成为现代生活中不可或缺的一部分。这种创新设备不仅内嵌了耳机、摄像头以及WiFi和蓝牙模块等核心硬件&#xff0c;还具备了音频播放、图像拍摄和无线通信等多种功能&#xff0c;极大地提升了信息获取…

深度学习经典模型之BERT(上)

深度学习经典模型之BERT(下&#xff09; BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 。由Google公司的…

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期&#xff1a;ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另&#xff1a;报错1-Error: Type mismatch between actual argument at (1) and a…

计算物理精解【3】- FORTRAN计算

文章目录 概述hello,world环境接收输入与输出 读取csv文件if and select case循环formatread,write formatread,write读写文件录入与读取数据文件定位csv 数组一维数组最小二乘法下标隐式循环 关系代数基本运算笛卡尔积投影选择 过程参数select case 和 过程module快排函数自定…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支&#xff0c;其核心在于表示学习&#xff08; Representation Learning \text{Representation Learning} Representation Learning&#xff09;&#xff0c;尤其是分布式表示&#xff08; Distributed Representation \text{Distribut…

【JUC并发编程系列】深入理解Java并发机制:高效并发背后的守护者(八、线程池的秘密)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;高效并发背后的守护者(八、线程池的秘密)1. 线程池基础知识1.1 什么是线程池1.2 为什么要使用线程池1.3 线程池使用场景1.4 线程池有哪些作用 2. 线程池基本用法2.1 线程池的创建方式2.2 线程池底层是如何实现复用…

前端vuex

需要共享的数据适合存储到vuex中 state基本使用 如果开启strict严格模式&#xff0c;直接修改上图的age会报错提示。不能在组件中直接修改state

“永辉优品”会是中国零售的答案吗?

投资者这么快就“看懂”名创优品的豪赌了&#xff1f; 9月25日&#xff0c;永辉超市继续一字涨停&#xff0c;而令人意外的是&#xff0c;名创优品也反弹近8%。 随着名创优品于9月23日晚间在港交所公告&#xff0c;以62.7亿人民币收购永辉超市29.4%的股权&#xff0c;两家公司…

数据科学的核心工具箱:全面解析pandas、matplotlib.pyplot与scipy.stats在复杂数据分析流程中的应用

在当今数据驱动的世界中&#xff0c;Python已成为数据分析和科学计算的首选语言。 而 pandas 、 matplotlib.pyplot 和 scipy.stats 这三个库则是数据科学家和分析师武器库中 的三把利剑。 1. pandas 数据处理的瑞士军刀 pandas 库是 Python数据分析 的基石&#xff0c;它…

Distilabel合成数据生成框架简明教程

Distilabel 是一个用于合成数据和 AI 反馈的框架&#xff0c;适用于需要基于经过验证的研究论文的快速、可靠和可扩展的管道的工程师。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 -…

SpringCloud~

帮你轻松入门SpringCloud~ 1 微服务概述 1.1什么是微服务 如idea中使用maven建立的一个个moudle&#xff0c;它具体是使用SpringBoot开发的一个小模块&#xff0c;专业的事交给专业的模块来做&#xff0c;每个模块完成一个具体的任务或功能。 1.2 什么是微服务架构 它将单一应用…

MyBatis 动态 SQL 使用指南

MyBatis 是一个流行的持久层框架&#xff0c;它通过 XML 或注解将接口方法与 SQL 映射在一起。动态 SQL 是 MyBatis 的一大特性&#xff0c;它使得构建灵活的查询变得简单。本文将通过一个 User 表的示例&#xff0c;介绍 MyBatis 中常用的动态 SQL 方法。 1. 什么是动态 SQL&…

飞驰云联亮相电子半导体数智化年会 获”数据交换领域最佳厂商”

2024年9月20日&#xff0c;“2024第二届电子半导体/智能制造数智化年会暨品牌出海论坛”于上海隆重开幕&#xff0c;Ftrans飞驰云联作为国内领先的数据安全交换厂商&#xff0c;应邀携半导体全场景产品和解决方案亮相此次峰会。会上进行了“智象奖”评选&#xff0c;Ftrans飞驰…

sql中的regexp与like区别

sql中的regexp与like区别 1、REGEXP2、LIKE3、区别与选择 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、REGEXP 用途&#xff1a;高级字符串匹配&#xff0c;使用正则表达式。特点&#xff1a;灵活性强&#xff0c;能进行复杂模式匹配…

Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时…

【iOS】引用计数(一)

【iOS】引用计数 文章目录 【iOS】引用计数前言ARC与MRC什么是引用计数的机制内存管理的思考方式自己生成的对象非自己生成的对象不再需要自己持有就释放无法释放非自己持有的对象 autorelease小结 前言 笔者最近开始学习了一下有关于引用计数的内容&#xff0c;写这篇博客来简…