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

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

抽象迭代器

/*** 迭代抽象* */
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.hqwc.cn/news/616509.html

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

相关文章

(N-149)基于微信小程序网上商城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

【Linux】应用层协议:HTTP

URL 在之前的文章中我们实现了一个网络版本的计算器&#xff0c;在那个计算器中揉合了协议定制以及序列化反序列化的内容&#xff0c;我们当时也自己定制了一套协议标准&#xff0c;比如请求和响应的格式应该是什么&#xff1f;如何读到一个完整的报文&#xff1f;支持的运算符…

ccframe系统的链路追踪,用户ID追踪的实现

需求 之前ccframe cloud V1用的是springcloud微服务&#xff0c;只需要在header将jwttoken一直传下去就没事&#xff0c;最近弄V2转dubbo发现用户id没有自动保存进数据库表。于是开始研究dubbo如何追踪&#xff0c;顺便把链路追踪ID的问题给一并解决掉。 理论 MDC MDC&…

在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者&#xff1a;来自 Elastic Iulia Feroli 是时候考虑语义搜索运营了吗&#xff1f; 无论你是一位经验丰富的搜索工程师&#xff0c;希望探索新的人工智能功能&#xff0c;还是一位机器学习专家&#xff0c;希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这…

anaconda创建了虚拟python环境,且安装了pytorch,但是pycharm中import torch运行时报错

报错如下&#xff1a; C:\Users\tashi\.conda\envs\test1\python.exe D:\project\python\transformer\main.py C:\Users\tashi\.conda\envs\test1\lib\site-packages\numpy\__init__.py:127: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL init…

供应链复杂业务实时数仓建设之路

供应链复杂业务实时数仓建设之路 背景 供应链业务是纷繁复杂的&#xff0c;我们既有 JIT 的现货模式中间夹着这大量的仓库作业环节&#xff0c;又有到仓的寄售&#xff0c;品牌业务&#xff0c;有非常复杂的逆向链路。在这么复杂的业务背后&#xff0c;我们需要精细化关注人货…

Redis搭建主从

Redis搭建主从: 1:拉取Redis镜像 docker pull redis2:创建主从对应的目录结构 3:对redis6379.log,redis6380.log,redis6381.log进行授权 chmod 777 redis6379.log chmod 777 redis6380.log chmod 777 redis6381.log4:修改主(master)的配置文件 5:创建主(master) redis_6379 …

express服务器 authorization 前端获取不到的问题

服务器生成token 设置在响应头&#xff0c;但是前端获取不到 const token JWT.generate({ id: new Date().getTime(), userName }, 10s) res.header(Authorization, token) axios.interceptors.response.use((response) > {console.log(response);if (response.data?.co…

【opencv】示例-neural_network.cpp 使用机器学习模块创建并训练一个简单的多层感知机(神经网络)模型...

#include <opencv2/ml/ml.hpp> // 引入OpenCV的机器学习模块using namespace std; // 使用标准命名空间 using namespace cv; // 使用OpenCV命名空间 using namespace cv::ml; // 使用OpenCV机器学习命名空间int main() {//创建随机训练数据Mat_<float> data(100, …

Linux的内存管理子系统

大家好&#xff0c;今天给大家介绍Linux的内存管理子系统&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 Linux的内存管理子系统是Linux内核中一个非常重要且复杂的子系统&#…

文件IO/标准IO

1.标准I/O 标准&#xff1a; 任何操作系统皆可使用&#xff1b;使用范围很广 系统调用和库函数 系统调用&#xff1a;操作系统给我们提供的接口 man 2 printf 可以调用内核中的接口 直接驱动显卡运行 printf实际是库函数中的函数&#xff0c;然后调用系…

openkylin系统通过网线连接ubuntukylin系统上网攻略

openkylin系统通过网线连接ubuntukylin系统上网攻略 主机1&#xff1a;x64 amd &#xff0c;系统&#xff1a;ubuntukylin 22.04 &#xff0c;状态&#xff1a;通过wifi连接热点进行上网&#xff0c;并共享网络。 主机2&#xff1a;x64 intel &#xff0c;系统&#xff1a;ope…