设计模式——迭代器模式15

news/2024/5/17 13:18:52

迭代器模式提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
设计模式,一定要敲代码理解
在这里插入图片描述

抽象迭代器

/*** 迭代抽象* */
public interface Iterator<A> {A next();boolean hasNext();
}

迭代器实现

/*** @author ggbond* @date 2024年04月13日 09:08*/
public class MyIterator<T> implements Iterator<T>{private MyCollection<T> myCollection;private  int size;private int index; //索引游标public MyIterator(MyCollection<T> myCollection) {this.myCollection = myCollection;this.index = 0;this.size = myCollection.getSize();}@Overridepublic T next() {if (index < size) {return myCollection.getNext(index++);}return null;}@Overridepublic boolean hasNext() {return index < size;}
}

抽象集合

/*** 定义集合* */
public interface Collection<A> {boolean add(A a);boolean remove(A a);Iterator<A> createIterator();}

集合实现

/*** @author ggbond* @date 2024年04月13日 09:12*/
public class MyCollection<T> implements Collection<T>{private ArrayList<T> list=new ArrayList<T>();public int getSize() {return list.size();}@Overridepublic boolean add(T t) {return list.add(t);}@Overridepublic boolean remove(T t) {return  list.remove(t);}@Overridepublic Iterator createIterator() {return new MyIterator(this);}public T getNext(int i) {return  list.get(i);}
}

迭代对象

/*** @author ggbond* @date 2024年04月13日 09:29*/
public class Person {String name;String cardID;public Person(String name, String cardID) {this.name = name;this.cardID = cardID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID = cardID;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", cardID='" + cardID + '\'' +'}';}
}

测试与结果

public class Main {public static void main(String[] args) {Person p1= new Person("ggbond1","001");Person p2= new Person("ggbond2","002");Person p3= new Person("ggbond3","003");Person p4= new Person("ggbond4","004");Collection<Person> collection=new MyCollection<>();collection.add(p1);collection.add(p2);collection.add(p3);collection.add(p4);Iterator<Person> iterator = collection.createIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
Person{name='ggbond1', cardID='001'}
Person{name='ggbond2', cardID='002'}
Person{name='ggbond3', cardID='003'}
Person{name='ggbond4', cardID='004'}

总结

迭代器模式将数据存储和数据遍历的职责进行分离。但针对不同结构的迭代对象,迭代方式需进行添加。

代码下载

代码下载


http://www.mrgr.cn/p/88040604

相关文章

数据加密技术在数据安全中的作用

随着信息技术的飞速发展,数据已成为现代社会最宝贵的资产之一。然而,数据的快速增长也带来了安全风险,包括数据泄露、篡改和滥用等。数据加密技术作为保护数据安全的重要手段,其重要性日益凸显。PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、…

生态短讯 | Tapdata 与 TDengine 完成产品兼容性互认证,打造物联网实时数据生态

近日,深圳钛铂数据有限公司自主研发的钛铂实时数据平台与 TDengine完成相互兼容性测试,兼容性良好,系统功能正常,运行稳定。近月,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的实时数据平台(Tapdata Live Data Platform)与北京涛思数据科技有限公司(以下简称涛思…

YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: &#x1f680;】 针对大尺度图像&#xff08;如遥感影像、大尺度工业检测图像等&#xff09;&#xff0c;由于设备的限制&#xff0c;无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练&#xff0c;再将训练结果…

Qt 6.5.5 链接和QML与C++交互的若干问题

需求描述 Qt Quick开发桌面组件,使用讯飞API(提供头文件、静态库、动态库),希望部署到Windows平台,在Qt Creator开发。 QML与C++交互 主要参考:QML与CPP,https://blog.csdn.net/gongjianbo1992/article/details/87965925 另有参考:信号与槽,https://blog.csdn.net/ife…

VK3602K SOP8抗干扰2键/2路/2按键/2通道触摸感应芯片,应用于加湿器触摸IC等大小家电产品

产品品牌:永嘉微电/VINKA 产品型号:VK3602K 封装形式:SOP8 概述 VK3602K具有2个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了2路直接输出功能,可通过IO脚选择输出电平。芯片内部采用特殊…

【运维自动化-配置平台】如何创建业务及拓扑(集群-模块)

业务&#xff0c;是蓝鲸 CD 体系中比较重要的概念和维度&#xff0c;日常使用中主机、进程、业务拓扑的管理都需要依赖已经存在的业务&#xff0c;其他蓝鲸体系产品也基本上都是围绕业务的维度来提供对应的服务和相关的鉴权。1、创建业务/业务集 请确保有创建业务的权限&#…

BGE M3-Embedding 模型介绍

BGE M3-Embedding是BAAI开源的embedding模型,支持多语言,多粒度,多功能检索,本文介绍模型的相关信息BGE M3-Embedding来自BAAI和中国科学技术大学,是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216,论文提出了一种新的embedding模型,称为M3-Embedding,它…

redis自学(37)集群伸缩

集群伸缩 添加一个节点到集群: Redis-cli--cluster提供了很多操作集群的命令,可以通过下面方式查看:比如,添加节点的命令先输入新增的ip和端口号,后输入集群已经有的ip和端口号好指定添加到哪个集群。默认是增加master节点,加上--cluster-slave是变成了slave。--cluster-…

LLM-大模型演化分支树、GPT派发展阶段及训练流程图、Infini-Transformer说明

大模型是怎么演进的&#xff1f; Encoder Only: 对应粉色分支&#xff0c;即BERT派&#xff0c;典型模型&#xff1a; BERT 自编码模型&#xff08;Autoencoder Model&#xff09;&#xff1a;通过重建句子来进行预训练&#xff0c;通常用于理解任务&#xff0c;如文本分类和阅…

winform入门篇 第13章 菜单栏

菜单栏 本章内容 菜单栏 工具栏 右键菜单 重点是右键菜单的实现。 菜单栏 MenuStrip&#xff0c;支持可视化编辑 添加 MenuStrip 添加菜单、菜单项、分隔线给菜单项设置属性 —Name 字段名&#xff0c;Text 文本显示,Image:图标 给菜单项添加事件处理(双击即可) 1.添加菜单…

如何在HTML中使用JavaScript:从基础到高级的全面指南!

JavaScript是一种轻量级的编程语言,通常用于网页开发,以增强用户界面的交互性和动态性。然而在HTML中,有多种方法可以嵌入和使用JavaScript代码。本文就带大家深入了解如何在HTML中使用JavaScript。 一、使用 script 标签 要在HTML中使用JavaScript,我们需要使用<script…

蓝桥杯 2019 省A 糖果 动态规划/二进制

#include <bits/stdc.h> // 包含标准库中的所有头文件 using namespace std;int main() {int n,m,k; // 定义变量n&#xff08;糖果包数&#xff09;、m&#xff08;口味数&#xff09;、k&#xff08;每包糖果的个数&#xff09;cin>>n>>m>>k; // 输入…

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

作者&#xff1a;小丫、琉璃 背景 为持续提升金融云环境的合规标准以及可用区内产品服务的性能和稳定性&#xff0c;阿里云将对杭州地域BCD三个金融云可用区进行基础设施架构升级与改造&#xff0c;对应可用区云产品将于 2024 年后停止服务&#xff0c;需要将业务迁移到新可用…

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程

HAL STM32 I2C方式读取MT6701磁编码器获取角度例程 &#x1f4cd;相关篇《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》&#x1f388;《STM32 软件I2C方式读取MT6701磁编码器获取角度例程》&#x1f4cc;MT6701当前最新文档资料&#xff1a;https://www.magntek.com.cn/u…

react 的拖动面板SplitPane的使用

1、我刚开始,是准备使用npm install react-split-pane 来引入的。 但是引入的过程报错了npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: active-workspace@6.0.7 npm ERR! Found: react@18.2.0 npm ERR…

2024年更新迭代最快的宿主软件FL Studio 24.0.99.4094中文激活版

FL Studio 24.0.99.4094中文激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21、FL Studio24等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#x…

Visual Studio调试C/C++指南

1. 前言 Visual Studio&#xff08;VS&#xff09;是微软开发的一款集成开发环境(IDE)软件&#xff0c;支持C/C、C#、VB、Python等开发语言&#xff0c;开发桌面、Web等应用程序。VS功能极其强大&#xff0c;使用极其便利&#xff0c;用户数量最多&#xff0c;被誉为"宇宙…

陇剑杯 省赛 攻击者1 CTF wireshark 流量分析

陇剑杯 省赛 攻击者1 题目 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │ acce…

7-01. 创建主菜单 UI

创建 Menu Canvas创建 Panel添加底图添加标题、版本、按钮如果希望图片周围没有黑框,需要把图片的 Read/Write 改成透明再添加一个说明 Panel再添加一个开始 Panel创建 MenuUI将三个 Panel 拖动到 MenuUI 上 对于 Panel 里面的每个 Button,调用 SwitchPanel 解决点击按钮中间…

kafka---topic详解

一、分区与高可用 在Kafka中,事件(events 事件即消息)是以topic的形式进行组织的;同时topic是分区(partitioned)的,这意味着一个topic分布在Kafka broker上的多个“存储桶”(buckets)上。这种数据的分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个…