Java设计模式-迭代器模式、迭代器模式是什么、怎么使用

news2024/9/29 7:19:00

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

6.9 迭代器者模式

6.9.1 定义

提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示

6.9.2 结构

  • 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象接口
  • 具体聚合角色(Concrete Aggregate):实现抽象聚合类,返回具体迭代器实例
  • 抽象迭代器角色(Iterator):定义访问和遍历聚合元素的接口,通常包括hasNext()、next()方法
  • 具体迭代器角色(Concrete Iterator):实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置

6.9.3 案例(学生存储)

  • 学生类
public class Student {  
    String name;  
    String number;  
    public Student(String name, String number) {  
        this.name = name;  
        this.number = number;  
    }  
    @Override  
    public String toString() {  
        return "Student{" +  
                "name='" + name + '\'' +  
                ", number='" + number + '\'' +  
                '}';  
    }  
}
  • 抽象迭代器
public interface IteratorStudent {  
    public boolean hasNext();  
    public Student next();  
}
  • 具体迭代器
public class IteratorStudentImpl implements IteratorStudent{  
    private List<Student> list;  
    private int position = 0;  
    public IteratorStudentImpl(List<Student> list) {  
        this.list = list;  
    }  
    @Override  
    public boolean hasNext() {  
        return position < list.size();  
    }  
    @Override  
    public Student next() {  
        return list.get(position ++);  
    }  
}
  • 抽象聚合
public interface StudentAggregate {  
//    添加学生  
    public void addStudent(Student student);  
//    删除学生  
    public void removeStudent(Student student);  
//    迭代器对象  
    IteratorStudent getStudentIterator();  
}
  • 具体聚合类
public class StudentAggregateImpl implements StudentAggregate{  
    private List<Student> list = new ArrayList<>();  
    @Override  
    public void addStudent(Student student) {  
        list.add(student);  
    }  
    @Override  
    public void removeStudent(Student student) {  
        list.remove(student);  
    }  
    @Override  
    public IteratorStudent getStudentIterator() {  
        return new IteratorStudentImpl(list);  
    }  
}
  • 测试
    public static void main(String[] args) {  
//        创建学生  
        Student student1 = new Student("张三","1211");  
        Student student2 = new Student("李四","1212");  
        Student student3 = new Student("王五","1213");  
//        创建聚合对象  
        StudentAggregate studentAggregate = new StudentAggregateImpl();  
//        添加学生对象  
        studentAggregate.addStudent(student1);  
        studentAggregate.addStudent(student2);  
        studentAggregate.addStudent(student3);  
//        获取迭代器遍历  
        IteratorStudent studentIterator = studentAggregate.getStudentIterator();  
        while (studentIterator.hasNext()){  
            System.out.println(studentIterator.next());  
        }  
    }
  • 结果
    ![[Pasted image 20230116165303.png]]
  • 类图![[Pasted image 20230116165331.png]]

6.9.4 优缺点

6.9.4.1 优点

  • 支持以不同方式遍历聚合对象,定义多种遍历模式:只需要定义不同迭代器就可改变原有遍历模式
  • 简化聚合类:在原有的聚合对象中不需要再自行提供数据遍历等方法
  • 扩展方便:由于引入抽象层,增加新聚合类和迭代器方便,无需修改原有代码

6.9.4.2 缺点

增加类个数,一定程度上增加系统复杂性

6.9.5 使用场景

  • 为聚合对象提供多种遍历方法
  • 为遍历不同的聚合结构提供一个统一的接口
  • 访问聚合对象的内容而无需暴露其内部细节

6.9.6 JDK源码

迭代器模式在JAVA中的很多集合中被应用,简单如下:

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();//Iterator接口子实现类对象
while(iterator.hasNext()){
System.out.println(iterator.next());
}

以ArrayList为例说明:

  • List:抽象聚合类
  • ArrayList:具体聚合类
  • Iterator:抽象迭代器
  • list.iterator:具体迭代器对象,返回实现了Iterator接口方法
    ArrayList具体代码实现:
public class ArrayList<E> extends AbstractList<E>  
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
                public Iterator<E> iterator() {  
			    return new Itr();  
			}
	private class Itr implements Iterator<E> {
	int cursor;       // index of next element to return  
	int lastRet = -1; // index of last element returned; -1 if no such  
	int expectedModCount = modCount;
	public boolean hasNext() {  
    return cursor != size;  
	}  
	public E next() {  
    checkForComodification();  
    int i = cursor;  
    if (i >= size)  
        throw new NoSuchElementException();  
    Object[] elementData = ArrayList.this.elementData;  
    if (i >= elementData.length)  
        throw new ConcurrentModificationException();  
    cursor = i + 1;  
    return (E) elementData[lastRet = i];  
}
 }}

意思就是在iterator方法中返回了一个实例化的Iterator对象,其中Itr是内部类,实现Iterator接口并重写了其中的抽象方法
使用建议:
自己定义容器类实现java.utl.Iterator<>并实现其中的iterator()方法使其返回一个java.utl.Iterator实现类即可

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

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

相关文章

[创业之路-48] :动态股权机制 -3- 静态股权分配 VS 动态股权分配

静态的股权分配是基础&#xff0c;动态的股权分配才是灵魂&#xff1a;只要你给了固态股权&#xff0c;比如说&#xff0c;股东A在最开始出资100万&#xff0c;占了10%的股份&#xff0c;但是&#xff0c;在后面的工作种&#xff0c;因为能力问题&#xff0c;价值观问题&#x…

回收租赁商城系统功能拆解12讲-会员权益

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

【自然语言处理】词袋模型在文本分类中的用法

词袋模型在文本分类中的用法1.加载数据 20 Newsgroups&#xff1a;数据被组织成 20 个不同的新闻组&#xff0c;每个新闻组对应一个不同的主题。一些新闻组彼此非常密切相关&#xff08;例如 comp.sys.ibm.pc.hardware / comp.sys.mac.hardware&#xff09;&#xff0c;而其他…

云原生之Docker容器的存储管理

一、检查本地docker环境 1.检查宿主机系统版本 [rootdocker ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) 2.检查docker版本 [rootdocker ~]# docker -v Docker version 20.10.18, build b40c2f6二、创建一个测试httpd容器 1.创建测试目录 [rootdoc…

Python版本PathPlanning运动规划库中RotationToWorldFrame函数内部计算过程分析

本文主要对Python版本PathPlanning运动规划库中RotationToWorldFrame函数的内部计算过程分析&#xff0c;包括相关必备python基础和计算过程分析两部分&#xff0c;并给出了等效的MATLAB版本计算过程程序&#xff0c;方便分析对比。 &#xff08;注&#xff1a;RotationToWorld…

【春节旅游攻略】南京周边出发,小众又好玩的景点推荐

【写在前面】 过年了&#xff0c;今天咱不谈技术&#xff0c;聊聊轻松的话题&#xff0c;旅游&#xff0c;其实博主很喜欢去外面走走看的&#xff0c;特汇总了一个4天3晚的旅行攻略&#xff0c;说走就走&#xff0c;带上自己的亲人多看看外面的锦世繁华。 三人行&#xff0c;…

使用最小二乘法和最大似然法估计非线性模型

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集本文是年前的最后一篇推文&#xff0c;我们来学习一下使用最小二乘法和最大似然法进行非线性模型估计。模型估计是指&#xff0c;在模型形式已知的情况下&#xff0c;求解出可以使已有数据与模型形式最大程度上相符…

【日常系列】LeetCode《28·动态规划3》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 二维数组中的路径问题 买卖股票的最佳时机 lc 62【剑指 098】【top100】&#xff1a;不同路径 https://leetcode.cn/problems/unique-paths/ 提示&#x…

分享优秀的视频地址

【2022 RISC-V中国峰会-芯来演讲合集】https://www.bilibili.com/video/BV1mV4y1W785?vd_source733efcf14020a43e7dac58e4c28ca0c8【计算机组成与设计&#xff1a;RISC-V【浙江大学】】https://www.bilibili.com/video/BV1tz411z7GN?vd_source733efcf14020a43e7dac58e4c28ca0…

【Dat图片的位异或解密】

文章目录 异或一、图片字节标识二、开始异或计算异或 异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为"⊕"&#xff0c;计算机符号为"eor"。其运算法则为: a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不相同&#xff0c;则异或结果为1。…

Tkinter的Label与Button

Tkinter是Python的一个内置包&#xff0c;主要用于简单的界面设计&#xff0c;使用起来非常方便。 目录 一、创建界面 1. 具体步骤 1.1 导入tkinter包 1.2 tk.Tk()函数&#xff1a;创建一个主界面&#xff0c;并命名为root 1.3 root.title()函数&#xff1a;给root界面设置…

API 接口案例--基于 MySQL 数据库 + Express对外提供用户列表的 API 接口服务

API 接口案例1. 案例需求2. 主要的实现步骤3. 搭建项目的基本结构4. 创建基本的服务器5. 创建 db 数据库操作模块6. 创建 user_ctrl 模块7. 创建 user_router 模块8. 导入并挂载路由模块9. 使用 try…catch 捕获异常1. 案例需求 基于 MySQL 数据库 Express 对外提供用户列表的…

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法 【论文原文】&#xff1a;Elimination of Non-Novel Segments at Multi-Scale for Few-Shot Segmentation 获取地址&#xff1a;https://openaccess.thecvf.com/content/WACV2023/papers/Kayabasi_Elimi…

【睿睿的2022年度总结和2023的目标】

博客主页&#xff1a;张栩睿的博客主页欢迎关注&#xff1a;点赞收藏留言系列专栏&#xff1a;c语言学习家人们写博客真的很花时间的&#xff0c;你们的点赞和关注对我真的很重要&#xff0c;希望各位路过的朋友们能多多点赞并关注我&#xff0c;我会随时互关的&#xff0c;欢迎…

畅捷通T+与道一云对接集成报销凭证

畅捷通T与道一云对接集成获取报销信息列表连通凭证创建(报销保险费&#xff08;甘肃&#xff09;)数据源系统:道一云在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提…

Allegro如何设置等长规则操作指导

Allegro如何设置等长规则操作指导 PCB设计需要给某一组信号做组间等长的时候,需要给这个组设置等长规则,如下图 以给以下两个网络设置等长规则为例 具体操作如下 打开规则管理器

【华为上机真题 2023】寻找相同子串

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

(17)go-micro微服务Prometheus监控

文章目录一 Prometheus监控介绍1.微服务监控系统promethues介绍2.微服务监控系统promethues工作流程二 Prometheus监控重要组件和重要概念1.微服务监控系统promethues重要组件2.微服务监控系统promethues重要概念三 微服务监控系统grafana看板四 Prometheus监控Grafana看板安装…

【LeetCode每日一题:1817. 查找用户活跃分钟数~~~读懂题目意思+HashMap】

题目描述 给你用户在 LeetCode 的操作日志&#xff0c;和一个整数 k 。日志用一个二维整数数组 logs 表示&#xff0c;其中每个 logs[i] [IDi, timei] 表示 ID 为 IDi 的用户在 timei 分钟时执行了某个操作。 多个用户 可以同时执行操作&#xff0c;单个用户可以在同一分钟内…

数据库 | 事务相关知识点总结

本专栏收录了数据库的知识点&#xff0c;而从本文起&#xff0c;将讲述有关于数据库设计有关知识点&#xff0c;提供给有需要的小伙伴进行学习&#xff0c;本专栏地址可以戳下面链接查看 &#x1f388; 数据库知识点总结&#xff08;持续更新中&#xff09;&#xff1a;【数据库…