行为型模式之迭代器模式

迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问集合对象中各个元素的方法,而无需暴露集合的内部表示。

在迭代器模式中,有三个主要角色:
迭代器(Iterator):定义了访问和遍历集合元素的接口。
具体迭代器(Concrete Iterator):实现迭代器接口,负责具体集合的遍历逻辑。
集合(Collection):定义创建迭代器对象的接口。
具体集合(Concrete Collection):实现集合接口,返回一个特定迭代器的实例。
迭代器模式的核心思想是将遍历集合的责任交给迭代器对象,而不是集合对象本身。
这样可以简化集合的接口,同时也使得各个迭代器可以独立变化而不影响集合对象。

使用迭代器模式的好处包括:
可以提供不同的遍历方式,如顺序遍历、逆序遍历等。
将集合与遍历算法解耦,允许独立修改它们。
可以隐藏集合的内部结构,提供统一的访问接口。

提供demo版代码更容易理解

/*** @author zhou*  迭代器接口*/
interface Iterator<T> {boolean hasNext();T next();
}/*** @author zhou*  具体迭代器的实现*/
class ConcreteIterator<T> implements Iterator<T> {private List<T> collection;private int index;public ConcreteIterator(List<T> collection) {this.collection = collection;this.index = 0;}public boolean hasNext() {return index < collection.size();}public T next() {if (hasNext()) {T item = collection.get(index);index++;return item;} else {throw new IndexOutOfBoundsException("End of iteration");}}
}/*** @author zhou*  集合接口*/
interface Collection<T> {Iterator<T> createIterator();
}/*** @author zhou*  具体集合实现*/
class ConcreteCollection<T> implements Collection<T> {private List<T> items;public ConcreteCollection(List<T> items) {this.items = items;}public Iterator<T> createIterator() {return new ConcreteIterator<>(items);}
}/*** @author zhou*  客户端代码*/
public class Main {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Collection<Integer> collection = new ConcreteCollection<>(list);Iterator<Integer> iterator = collection.createIterator();while (iterator.hasNext()) {Integer item = iterator.next();System.out.println(item);}}
}

我们定义了一个迭代器接口 Iterator,具体迭代器实现 ConcreteIterator,集合接口 Collection,和具体集合实现 ConcreteCollection。
使用示例代码中的 Main 类来展示如何使用迭代器模式。

在 ConcreteIterator 中,我们使用一个 List 来存储集合元素,并通过索引 index 来控制迭代过程。
在 hasNext 方法中判断是否还有下一个元素,next 方法返回下一个元素并将索引加一。
在 ConcreteCollection 中,我们以一个 List 作为具体集合的内部数据结构,并实现了 createIterator 方法返回具体迭代器实例。

在 Main 类的 main 方法中,我们创建了一个包含整数的 List 对象,并将其传递给 ConcreteCollection 的实例。
然后通过调用 createIterator 方法获取一个迭代器,并使用 while 循环遍历集合中的元素并输出结果。
该示例展示了如何使用迭代器模式来遍历集合并访问其中的元素,提供了灵活的遍历方式,并将集合与具体的遍历实现解耦。

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

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

相关文章

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…

bgp联邦

1、ip配置 [r1-LoopBack0]ip address 192.168.1.1 24 [r1-LoopBack1]ip address 10.0.0.1 24 [r1-GigabitEthernet0/0/0]ip address 12.0.0.1 24[r2-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [r2-GigabitEthernet0/0/1]ip address 172.16.1.1 29 [r2-GigabitEthernet0/0/…

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

【计算机视觉】DINOv2(视觉大模型)代码使用和测试(完整的源代码)

文章目录 一、环境部署二、导入原图2.1 使用vit_s14的模型 三、使用其他模型3.1 使用vit_b14的模型3.2 使用vit_l14的模型3.3 使用vit_g14的模型 一、环境部署 !git clone https://ghproxy.com/https://github.com/facebookresearch/dinov2.git输出为&#xff1a; Cloning in…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染&#xff0c;换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

C++初阶 - 3.类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 1.类…

FCOS 论文学习

1. 解决了什么问题&#xff1f; 之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点&#xff1a; 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感&#xff1b;即使精心设计了 anchors&#xff0c;但由于大小和宽高…

论文投稿前细节检查

参考文献的doi统一要或不要&#xff0c;要参考期刊/会议之前的版本参考文献的会议和期刊作者的缩写方式&#xff0c;论文标题的首字母&#xff0c;发表会议或期刊的首字母&#xff0c;年份的位置等是否统一。同时&#xff0c;建议会议直接给缩写&#xff0c;期刊给全称。Fig、T…

【x-shell】介绍以及命令大全

提示&#xff1a;x-shell命令 介绍&#xff0c;以及命令大全 文章目录 前言一、x-shell是什么&#xff1f;二、x-shell功能三、x-shell使用四、x-shell的常用命令五、 ps -ef | grep 命令总结 前言 x-shell 提示&#xff1a; 一、x-shell是什么&#xff1f; x-shell命令&…

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

【 NLP 】 句子transformer调用备忘录

一、说明 本篇对句子嵌入、文本相似性、语义搜索和图像搜索等诸方面调用实现进行记录,以便再次调用时,可以参考。

数据结构之List(双向链表)的实现

链节 链表由节点连成&#xff0c;节点的定义如下 # pragma once # include <iostream>template <typename T> struct listNode {T data;listNode <T>* pred;listNode <T>* succ;listNode(){}listNode(T d, listNode<T>* p, listNode<T>*…

Zabbix 自动发现及注册

1、依次选择 Configuratio、Discovery、Create discovery rule&#xff08;配置、自动发现、创建发现规则&#xff09; 创建客户端发现规则 2、zabbix客户端安装 agent zabbix客户端一键安装脚本 脚本参考链接 #!/bin/bash #Zabbix-Agent 5.0Zabbix_Service192.168.63.20#安…

【PHP面试题44】PHP5的版本和PHP7之间有哪些区别

文章目录 一、前言二、底层调整2.1性能提升2.2 新的引擎2.3 数据类型改进2.4 错误处理改进2.5 语言特性增加 三、应用层差异3.1 兼容性3.2 类和方法改进3.3 错误处理机制3.4 性能优化3.5 新的扩展支持 四、一些语法糖示例4.1 标量类型声明示例4.2 新增了Spaceship操作符&#x…

win11中的pagefile.sys

在C盘系统下&#xff0c;有一个命名为pagefile.sys的文件占用C盘太大的空间&#xff0c;不少用户怕删除pagefile.sys文件之后会对系统造成影响&#xff0c;而不少用户想要将pagefile.sys文件移动到D盘中。那么pagefile.sys是什么文件&#xff1f;Win10系统下pagefile.sys文件太…

【C++】list的模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

B072-项目实战-用户模块--前台登录 三方登录

目录 前台登录-账号登录前端完成左上角显示用户信息配置前置拦截器、后置拦截器和不受限资源拦截器 三方登录-微信登录概述流程图用法代码实现步骤分析:实现准备代码前端login.htmlcallback.html 后端LoginController-微信登录LoginServiceImpl-微信登录解决回调域名不能跨域绑…

安达发|某大厂使用APS计划排程真实成功案例

在很多群里、朋友圈、公众号上可以看到&#xff0c;很多精益咨询老师认为&#xff0c;不仅ERP不啥用&#xff0c;APS更是无聊之举&#xff0c;而且肯定是用不好的。但&#xff0c;事实上可能还真不是这样的。 一个深圳的客户&#xff0c;用了APS以后&#xff0c;不仅装配的齐套…