行为型设计模式—迭代器模式

迭代器模式:也叫作游标模式,能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。在迭代器的帮助下, 客户端可以用一个迭代器接口以相似的方式遍历不同集合中的元素。

当集合背后为复杂的数据结构且希望对客户端隐藏其复杂性时 出于使用便利性或安全性的考虑),或希望代码能够遍历不同的甚至是无法预知的数据结构 可以使用迭代器模式

在这里插入图片描述

  • Iterator 接口: 这个接口会定义一些基础的操作函数,如hasNext()getNext()等。通过名称就可以看出,这些方法可以帮助我们执行遍历集合、重启迭代等操作。
  • Collection 接口: 这个接口代表了要被遍历的集合。在这个接口里定义了一个createIterator方法,该方法会返回一个Iterator的实例。
  • Concrete Iterator: Iterator接口的具体实现类。
  • Concrete Collection: Collection接口的具体实现类。
  • 客户端 Client:通过集合和迭代器的接口与两者进行交互。 这样一来客户端无需与具体类进行耦合, 允许同一客户端代码使用各种不同的集合和迭代器。

迭代器接口

type Iterator interface {hasNext() boolgetNext() *User
}

集合接口

type Collection interface {createIterator() Iterator
}

用户类

type User struct {name stringage  int
}

用户集合数据结构

type UserCollection struct {users []*User
}// 实现集合接口
func (u *UserCollection) createIterator() Iterator {return &UserIterator{users: u.users,}
}

实现迭代器接口

type UserIterator struct {index intusers []*User
}func (u *UserIterator) hasNext() bool {if u.index < len(u.users) {return true}return false}
func (u *UserIterator) getNext() *User {if u.hasNext() {user := u.users[u.index]u.index++return user}return nil
}

main函数

func main() {user1 := &User{name: "a",age:  30,}user2 := &User{name: "b",age:  20,}userCollection := &UserCollection{users: []*User{user1, user2},}iterator := userCollection.createIterator()for iterator.hasNext() {user := iterator.getNext()fmt.Printf("User is %+v\n", user)}
}

结果

User is &{name:a age:30}
User is &{name:b age:20}

迭代器模式在平时编程的时候使用的并不多,像Java、C#编程时都自带了迭代器模式的实现,也支持实现语言内置的Iterator接口来给自定义集合创建迭代器。

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

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

相关文章

Qt扩展-muParser数学公式解析

muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_…

【中关村开源生态论坛暨大模型智能应用技术大会】—— 探索AI和开源在未来的应用

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-9ttR7rpX3BzyF2C4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

阿赵UE学习笔记——13、贴花

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次介绍一种特殊的材质类型&#xff0c;贴花。 一、获取贴花资源 在没有分析贴花的原理之前&#xff0c;可以先去获得一些免费的贴花资源来使用&#xff0c;比如在Quixel上面就有专门的一个资源…

【QT+QGIS跨平台编译】之十七:【iconv+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、iconv介绍二、文件下载三、文件分析四、pro文件五、编译实践一、iconv介绍 iconv是一个用于字符编码转换的开源程序。它可以将一个字符集的文本转换为另一个字符集,例如将UTF-8编码的文本转换为GBK编码。 iconv的主要特点包括: 支持多种字符集:iconv支持多种…

初识C语言·文件操作

目录 1 关于文件 i)文件的基本知识 ii)数据文件的分类 2 文件打开和关闭 i)流和标准流 ii)文件指针 iii)文件打开和关闭 3 文件的顺序读写 i) fgetc fputc ii) fgets fputs iii) fscanf fprintf iv) fwrite fread 4 对比一组函数 scanf/fscanf/sscanf/printf/fpri…

C 语言学习五:函数与程序结构

函数与程序结构 函数的声明与定义函数的声明函数的定义函数重载内联函数递归函数构造函数lambda 函数 函数的参数形参和实参值传递和引用传递默认参数 函数的返回返回多个值返回引用返回指针返回对象 头文件内部函数和外部函数内部函数外部函数 函数的声明与定义 函数的声明 …

VMware虚拟机安装macOS

VMware虚拟机安装macOS 文章目录 VMware虚拟机安装macOS先看效果一、准备工作①&#xff1a;镜像资源下载②&#xff1a;虚拟机③&#xff1a;安装macOS所必要的插件 二、开始安装①&#xff1a;创建新的虚拟机②&#xff1a;自定义硬件③&#xff1a;开启虚拟机 先看效果 一、…

新东方财报解读:新一轮增长逻辑或蕴于电商业务?

从财报表现来看&#xff0c;教育市场的元气在持续提升。 近日&#xff0c;新东方、好未来等上市公司陆续公布了2023年9-11月的业绩表现。其中&#xff0c;好未来实现营收3.7亿美元&#xff0c;同比增长60.5%&#xff1b;归母净亏损2394.6万美元&#xff0c;亏幅同比收窄53.6%。…

Linux命令之 vim 详解

所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 安装vim编辑器 yum install vi…

Redis常见数据类型[上]

目录 前言&#xff1a; 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码&#xff1a; 单线程架构 引出单线程模型&#xff1a; 为什么单线程还这么快&#xff1f; String字符串 字符串数据类型&#xff1a; 常见命令&#xff1a; S…

sql题之使用划分会话的方式解决统计间隔连续登录问题

现有各用户的登录记录表&#xff08;login_events&#xff09;如下&#xff0c;表中每行数据表达的信息是一个用户何时登录了平台。 user_idlogin_datetime1002021-12-01 19:00:001002021-12-01 19:30:001002021-12-02 21:01:00 现要求统计各用户最长的连续登录天数&#xff0…

嵌入式学习第十五天!(内存管理、链表)

1. 内存管理&#xff1a; 1. malloc void *malloc(size_t size); 功能&#xff1a;申请堆区空间 参数&#xff1a;size&#xff1a;申请堆区空间的大小 返回值&#xff1a;返回获得的空间的首地址&#xff0c;失败返回NULL 2. free void free(void *ptr); 功能&#xff1a;释…

volatile 关键字的用法说明

volatile字面翻译为不稳定的&#xff0c;易变的。 一般编译器优化时&#xff0c;如果一个数据已经读取进寄存器&#xff0c;后续会优先从寄存器中取值来减少访问存储时间&#xff0c;但如果此数值会随时变动&#xff0c;结果就会出现错误 以下测试 #include <stdio.h> i…

信效度检验2(SPSS

目录 1.效度介绍&#xff1a;2.效度检验&#xff1a;小结&#xff1a; 1.效度介绍&#xff1a; 用于研究题项设计是否合适 2.效度检验&#xff1a; 点击 降维->因子 把涉及到因变量的问题放入即可&#xff1a; 勾选&#xff1a; 得到输出结果&#xff1a; KMO值 0.7…

C语言实战三:图书管理系统

这个图书管理系统包括了添加、查找、删除、编辑、显示和保存书籍信息的功能。书籍信息被保存在一个文本文件中&#xff0c;在程序启动时从文件中加载&#xff0c;退出程序时保存到文件中。用户可以通过命令行界面操作图书管理系统&#xff0c;并进行相应的功能操作。 一、代码…

pg数据库替换指定ip

pg数据库替换指定ip 配菜单是部署机ip发生变化&#xff0c;记录一下处理方法,先根据源ip查询出主键id&#xff0c;在将源ip替换成目标ip updatesys_menu sethref replace(href, 10.116.63.4, 10.116.58.23) whereid in(select*fromsys_menuwherehref like %10.116.58.23% )

信息学奥赛一本通1931:【05NOIP普及组】校门外的树

1931&#xff1a;【05NOIP普及组】校门外的树 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9210 通过数: 6928 【题目描述】 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一…

24校招,快手测试开发工程师二面

前言 大家好&#xff0c;我是chowley&#xff0c;今天回顾一下&#xff0c;之前参加快手的校招面试 全程没有测试方向问题&#xff0c;一直拷打编程语言特性和数据底层结构 时间&#xff1a;50min 平台&#xff1a;轻雀&#xff08;请勿切屏&#xff09; 过程 自我介绍用…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …