当前位置: 首页 > news >正文

设计模式-迭代器

文章目录

  • 1. 引言
    • 1.1 概述
    • 1.2 设计模式
    • 1.3 迭代器模式的应用场景
    • 1.4 迭代器模式的作用
  • 2. 基本概念
    • 2.1 迭代器 Iterator
    • 2.2 聚合 Aggregate
    • 2.3 具体聚合 ConcreteAggregate
  • 3. Java 实现迭代器模式
    • 3.1 Java 集合框架
    • 3.2 Java 迭代器接口
    • 3.3 Java 迭代器模式实现示例
  • 4. 迭代器模式的优缺点
    • 4.1 优点
    • 4.2 缺点
  • 5. 迭代器模式和其他设计模式的关系
    • 5.1 迭代器模式和工厂模式
    • 5.2 迭代器模式和组合模式
    • 5.3 迭代器模式和模板方法模式
  • 6. 总结
    • 6.1 迭代器模式的应用场景
    • 6.2 迭代器模式与其他设计模式的关系
    • 6.3 迭代器模式的优缺点

1. 引言

1.1 概述

迭代器模式是一种行为型设计模式,它允许客户端逐个访问聚合对象中的元素,而不用暴露聚合对象的内部表示。

1.2 设计模式

设计模式是解决特定问题的经过验证的最佳实践,它提供了一种通用的解决方案,可以在不同的场景下重复使用。

1.3 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。
在这里插入图片描述

1.4 迭代器模式的作用

迭代器模式的主要作用是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。

2. 基本概念

2.1 迭代器 Iterator

迭代器是一个接口,定义了访问和遍历聚合对象元素的方法。迭代器提供了一种统一的访问方式,使得客户端可以不依赖聚合对象的具体类型和内部结构,而直接访问其中的元素。

2.2 聚合 Aggregate

聚合是一个接口,表示一个集合对象。聚合对象通常包含多个元素,可以提供多种访问方法,例如获取某个元素、添加和删除元素等。

2.3 具体聚合 ConcreteAggregate

具体聚合是聚合的具体实现,它实现了聚合接口,并且维护了内部元素的数据结构,例如数组、链表、栈、队列等。

3. Java 实现迭代器模式

3.1 Java 集合框架

Java 集合框架是一组用于存储和操作元素的类和接口。集合框架提供了多种数据结构和算法,可以满足不同场景下的需求。Java 集合框架中的所有集合类都实现了 Iterable 接口,因此都可以使用迭代器进行遍历操作。

3.2 Java 迭代器接口

Java 提供了一个迭代器接口 Iterator,定义了访问和遍历集合中元素的方法。迭代器接口包含多个方法,例如 hasNext()、next()、remove() 等。

以下是迭代器接口的定义:

public interface Iterator<E> {boolean hasNext();E next();void remove();
}

3.3 Java 迭代器模式实现示例

以下是一个使用迭代器模式的简单示例,通过实现 Iterable 和 Iterator 接口,在不暴露内部结构的情况下遍历聚合对象中的元素。

import java.util.Iterator;public class MyCollection<T> implements Iterable<T> {private T[] elements;private int size;public MyCollection(T[] elements) {this.elements = elements;this.size = elements.length;}@Overridepublic Iterator<T> iterator() {return new MyIterator();}private class MyIterator implements Iterator<T> {private int index;public MyIterator() {this.index = 0;}@Overridepublic boolean hasNext() {return index < size;}@Overridepublic T next() {return elements[index++];}@Overridepublic void remove() {throw new UnsupportedOperationException();}}
}
public class Client {public static void main(String[] args) {String[] names = {"Alice", "Bob", "Charlie", "Dave"};MyCollection<String> collection = new MyCollection<>(names);Iterator<String> iterator = collection.iterator();while (iterator.hasNext()) {String name = iterator.next();System.out.println(name);}}
}

在上述代码中,MyCollection 实现了 Iterable 接口,并且返回一个实现了 Iterator 接口的内部类 MyIterator。MyIterator 中维护了一个 index 变量,表示当前遍历到的元素位置,hasNext() 方法用于判断是否还有下一个元素,next() 方法用于返回当前元素并将 index 加一。
在这里插入图片描述

4. 迭代器模式的优缺点

4.1 优点

  • 将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,遍历过程不会受到影响。
  • 提供了多种遍历方式,客户端可以根据自己的需求选择合适的遍历方式。
  • 对于不同类型的聚合对象,都可以提供统一的访问方式,使得客户端编码更加简单。

4.2 缺点

  • 对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

5. 迭代器模式和其他设计模式的关系

5.1 迭代器模式和工厂模式

迭代器模式和工厂模式可以相互配合使用。在工厂模式中,可以使用迭代器遍历某个产品对象中的元素,实现对产品的全面访问。

5.2 迭代器模式和组合模式

迭代器模式和组合模式可以相互配合使用。在组合模式中,可以使用迭代器遍历整个组合结构中的所有元素,实现对组合结构的遍历和访问。

5.3 迭代器模式和模板方法模式

迭代器模式和模板方法模式也可以相互配合使用。在模板方法模式中,可以将迭代器作为模板方法的一部分,实现对聚合对象中元素的遍历和访问。

6. 总结

6.1 迭代器模式的应用场景

迭代器模式通常在需要遍历一个聚合对象中的元素,并且不想暴露其内部结构时使用。例如,Java 中的集合框架就使用了迭代器模式来遍历集合中的元素。

6.2 迭代器模式与其他设计模式的关系

迭代器模式和工厂模式、组合模式、模板方法模式等其他设计模式可以相互配合使用,实现更加灵活的编程。

6.3 迭代器模式的优缺点

迭代器模式的主要优点是将聚合对象的遍历行为与其内部结构分离开来,从而使得聚合对象的数据结构可以独立地变化,同时也可以提供多种遍历方式。其缺点是对于某些聚合对象,如果其内部结构发生变化,可能会导致迭代器失效,需要重新创建新的迭代器。

相关文章:

设计模式-迭代器

文章目录 1. 引言1.1 概述1.2 设计模式1.3 迭代器模式的应用场景1.4 迭代器模式的作用 2. 基本概念2.1 迭代器 Iterator2.2 聚合 Aggregate2.3 具体聚合 ConcreteAggregate 3. Java 实现迭代器模式3.1 Java 集合框架3.2 Java 迭代器接口3.3 Java 迭代器模式实现示例 4. 迭代器模…...

Hive学习(12)Hive常用日期函数

1、hive返回当天三种方式 select current_date; --返回年月日 --2017-06-15 select current_timestamp; --返回年月日时分秒 --2017-06-15 19:54:44 SELECT from_unixtime(unix_timestamp()); --2017-06-15 19:55:042、from_unixtime&#xff1a;转化unix时间戳到当前时区的时…...

PowerQuery动态加载M公式

Power Query 是Excel中的强大数据处理与转换工具&#xff0c;如果需要“动态”处理数据&#xff0c;大家第一时间想到的是可以使用VBA&#xff0c;利用代码创建M公式&#xff0c;进而创建PQ查询&#xff0c;但是复杂的M公式可能有很多行&#xff0c; 使用VBA处理起来并不是很方…...

2分钟搭建FastGPT训练企业知识库AI助理(Docker部署)

我们使用宝塔面板来进行搭建&#xff0c;更方便快捷灵活&#xff0c;争取操作时间只需两分钟 宝塔面板下安装Docker 在【软件商店中】安装【docker管理器】【docker模块】即可 通过Docker安装FastGPT 通过【Docker】【添加容器】【容器编排】创建里新增docker-compose.yaml以下…...

TDengine函数大全-字符串函数

以下内容来自 TDengine 官方文档 及 GitHub 内容 。 以下所有示例基于 TDengine 3.1.0.3 TDengine函数大全 1.数学函数 2.字符串函数 3.转换函数 4.时间和日期函数 5.聚合函数 6.选择函数 7.时序数据库特有函数 8.系统函数 字符串函数 TDengine函数大全CHAR_LENGTHCONCATCONCA…...

part-02 C++知识总结(类型转换)

一.C常用的类型转换函数 在C中&#xff0c;有几种自带的类型转换函数可以用于不同类型之间的转换。以下是其中一些常用的自带类型转换函数&#xff1a; 1.隐式转换&#xff08;Implicit Conversion&#xff09; 数字类型之间的隐式转换&#xff0c;例如将int转换为float、do…...

stable diffusion实践操作-图生图

本文专门开一节写图生图相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文...

Jtti:Ubuntu18.04如何修改远程ssh端口号

要在Ubuntu 18.04上修改SSH的远程端口号&#xff0c;您需要编辑SSH服务器配置文件并指定新的端口号。以下是具体的步骤&#xff1a; 以root或具有sudo权限的用户登录到您的Ubuntu服务器。 备份SSH配置文件&#xff08;可选&#xff09;&#xff1a; 在进行任何更改之前&…...

微软表示Visual Studio的IDE即日起开启“退休”倒计时

据了解&#xff0c;日前有消息透露称&#xff0c;适用于 Mac平台的Visual Studio集成开发环境(IDE)于8月31日启动“退休”进程。 而这意味着Visual Studio for Mac 17.6将继续支持12个月&#xff0c;一直到2024年8月31日。    微软表示后续不再为Visual Studio for Mac开发…...

好马配好鞍:Linux Kernel 4.12 正式发布

Linus Torvalds 在内核邮件列表上宣布释出 Linux 4.12&#xff0c;Linux 4.12 的主要特性包括&#xff1a; BFQ 和 Kyber block I/O 调度器&#xff0c;livepatch 改用混合一致性模型&#xff0c;信任的执行环境框架&#xff0c;epoll 加入 busy poll 支持等等&#xff0c;其它…...

element——switch接口成功后赋值打开开关

应用场景 基本用法使用v-model双向绑定值&#xff0c;进行开关控制 例子1:需求&#xff1a; **点击switch&#xff0c;出弹窗&#xff0c;点击弹窗保存按钮调接口成功后再赋值&#xff08;row.orderButtonValue“1”&#xff09;打开switch开的状态变颜色。 在vue 中使用 :va…...

WPF Border设置渐变色

背景色渐变 <Border> <Border.Resources> <Style TargetType"Border"> <Setter Property"Background"> …...

SAP_ABAP_OLE_EXCEL批导案例

SAP ABAP顾问能力模型梳理_企业数字化建设者的博客-CSDN博客SAP Abap顾问能力模型https://blog.csdn.net/java_zhong1990/article/details/132469977 一、OLE_EXCEL批导 1.1 下载按钮 1.2 选择EXCEL上传&#xff0c;解析EXCLE数据&#xff0c; Call屏幕。 1.3 实现效果 1.4…...

MySQL以及版本介绍

一、MySQL的介绍 MySQL数据库管理系统由瑞典的DataKonsultAB公司研发&#xff0c;该公司被Sun公司收购&#xff0c;现在Sun公司又被Oracle公司收购&#xff0c;因此MySQL目前属于 Oracle 旗下产品。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用…...

stm32 iap sd卡升级

参考&#xff1a;STM32F4 IAP 跳转 APP问题_stm32程序跳转_古城码农的博客-CSDN博客 app程序改两个位置 1.程序首地址&#xff1a; 2.改中断向量表位移&#xff0c;偏移量和上面一样就可以 然后编译成bin文件就可以了...

D358周赛复盘:哈希表模拟⭐⭐+链表乘法翻倍运算(先反转)⭐⭐⭐

文章目录 2815.数组中的最大数对和思路完整版 2816.翻倍以链表形式表示的数字&#xff08;先反转&#xff0c;再处理进位&#xff09;思路完整版 补充&#xff1a;206.反转链表&#xff08;双指针法&#xff09;完整版 2817.限制条件下元素之间的最小绝对差&#xff08;cpp不知…...

java八股文面试[数据库]——索引的基本原理、设计原则

索引的设计原则 索引覆盖是什么&#xff1a; 索引&#xff08;在MySQL中也叫做“键&#xff08;key&#xff09;”&#xff09; 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时&#xff0c;索引…...

2023年京东方便食品行业数据分析(京东数据报告)

​疫情中方便食品的销售一度火爆&#xff0c;但随着当前消费场景的开放&#xff0c;方便食品销售又恢复常态并开始下滑。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台方便食品的销量为800万&#xff0c;环比降低约23%&#xff0c;同比降…...

无涯教程-Android - Style Demo Example函数

下面的示例演示如何将样式用于单个元素。让我们开始按照以下步骤创建一个简单的Android应用程序- 步骤说明 1 您将使用Android Studio IDE创建一个Android应用程序,并在 com.example.saira_000.myapplication 包下将其命名为 myapplication ,如中所述您好世界Example一章。 2 …...

【算法训练-字符串 二】最长回文子串

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【最长回文子串】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为…...

结合OB Cloud区别于MySQL的4大特性,规划降本方案

任何一家企业想要获得持续性的发展与盈利&#xff0c;“降本增效”都是难以绕开的命题。但是“一刀切”的降本影响往往不太可控&#xff0c;成本的快速收缩往往会给业务带来低效运营和增长缓慢的风险。所以我们所说的降本&#xff0c;是指在成本降低的同时&#xff0c;效率不降…...

题目有点太简单了,不知道怎么选了

有个公司给了下面一个题目&#xff0c;看了下太简单了&#xff0c;都怕选错了。 后来拿着程序跑了下&#xff0c;就是这个意思嘛。 结论 程序跑出来的结果就是对输入的列表进行倒序排列。 public void testGetPut() throws Exception {List<Integer> numbers List.of(…...

Bug:mac上运行go run main.go 报错,fork/exec /var/fold/T/go-build269/b001/ex

Bug&#xff1a;mac上运行go run main.go 报错&#xff0c;fork/exec /var/fold/T/go-build269/b001/ex 今天通过goland执行go run main.go运行我本地编写好的go代码时&#xff0c;发现报错fork/exec / xxx 解决办法 方法一&#xff1a; 因为当前go的build环境不对&#xff0c…...

CSRF与XSS结合利用

文章目录 修改cms网站后台管理员密码成功登录总结 修改cms网站后台管理员密码 CSRF和XSS结合的JS代码&#xff1a; <script> xmlhttp new XMLHttpRequest(); xmlhttp.open("post","http://10.4.7.130/cms/admin/user.action.php",false); xmlhttp…...

【爬虫】实验项目一:文本反爬网站的分析和爬取

目录 一、实验目的 二、实验预习提示 ​编辑 三、实验内容 四、实验要求 五、实验过程 1. 基本要求&#xff1a; 2. 改进要求A 3. 改进要求B: 六、资料 1.实验框架代码&#xff1a; 2.OpenSSL&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light…...

DEAP库文档教程二-----创建类型

本节将展示如何通过creator创建类型以及如何使用toolbox进行初始化。 1、Fitness 已经提供的Fitness类是一个抽象类&#xff0c;它需要weight来使得它成为一个函数。一个最小化的适应度是通过负权重构建的&#xff0c;而一个最大化适应度则需要正权重。 creator.create(&quo…...

Axure RP美容美妆医美行业上门服务交互原型图模板源文件

Axure RP美容美妆医美行业上门服务交互原型图模板源文件&#xff0c;原型内容属于电商APP&#xff0c;区别于一般电商&#xff0c;它的内容是‘美容美发美妆等’上门服务等。大致流程是线上买单&#xff0c;线下实体店核销消费。 附上预览演示&#xff1a;axure9.com/mobile/73…...

【SpringBoot】用SpringBoot代码详细解释<List>的用法

在Spring Boot应用程序中&#xff0c;我们可以使用Java集合框架中的List接口来存储并操作一组数据。 List是Java集合框架中的一种数据结构&#xff0c;用于存储一组有序的元素。使用List可以方便地向其中添加、删除或者修改元素&#xff0c;也可以通过下标或者迭代器遍历其中的…...

HRS--人力资源系统(Springboot+vue)--打基础升级--(六)分页查询 + 重置按钮

一&#xff1a;先弄个简单的重置按钮 1.界面设计就放在搜索框同一列的位置 2. 在点击重置按钮时&#xff0c;清空搜索框内的内容&#xff0c;同时触发一次无条件查询(这个写法有bug&#xff0c;下面会有说明) 二&#xff1a;做分页 在MyBatis中&#xff0c;有多种方法可以实现分…...

JavaScript设计模式(二)——简单工厂模式、抽象工厂模式、建造者模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...