【Java设计模式】二十、迭代器模式

文章目录

  • 1、迭代器模式
  • 2、案例
  • 3、总结
  • 4、在源码中的实际应用

1、迭代器模式

  • 提供了一种遍历的方式
  • 提供了一个对象来顺序访问聚合对象(集合、容器)中的一系列数据,而不会暴露聚合对象的内部表示

相关角色:

  • 抽象聚合:定义存储、添加、删除元素、创建迭代器对象的方法
  • 具体聚合:返回一个具体的迭代器实例
  • 抽象迭代器:定义访问和遍历元素的方法,如hasNest()、next()
  • 具体迭代器:实现元素的遍历,记录遍历的当前位置

2、案例

定义一个存储学生对象的容器对象,由迭代器实现遍历。

在这里插入图片描述

先定义Student这个业务类:

@Getter
@Setter
@AllArgsConstructs
public class Student{

	private String name;

	private String number;
}

定义抽象迭代器接口,声明hasNext、next两个抽象方法。next方法想要通用的话,就用泛型。

public interface StudentIterator {
    boolean hasNext();  //判断是否还有元素
    Student next();   //获取下一个元素
}

定义具体的迭代器类,重写所有的抽象方法。聚合元素类。

public class StudentIteratorImpl implements StudentIterator {

    private List<Student> list;
    
    private int position = 0;   //用来记录遍历时的位置

    public StudentIteratorImpl(List<Student> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return position < list.size(); //有元素
    }

    @Override
    public Student next() {
        Student currentStudent = list.get(position);
        position ++;
        return currentStudent;
    }
}

定义抽象容器类,提供:添加元素,删除元素,获取迭代器对象的方法

public interface StudentAggregate {

    void addStudent(Student student);  

    void removeStudent(Student student);

    StudentIterator getStudentIterator();
}

定义具体的容器类,重写所有的方法

public class StudentAggregateImpl implements StudentAggregate {

    private List<Student> list = new ArrayList<Student>();  // 学生列表

    @Override
    public void addStudent(Student student) {
        this.list.add(student);
    }

    @Override
    public void removeStudent(Student student) {
        this.list.remove(student);
    }

    @Override
    public StudentIterator getStudentIterator() {
        return new StudentIteratorImpl(this.list);    //迭代器对象中的集合,和聚合对象中的集合,保持一致了
    }
}

测试效果:

public class Client {

	public static void main(String[] args) {
		//创建聚合对象
		StudentAggregate aggregate = new StudentAggregateImpl();
		//添加元素
		aggregate.addStudent(new Student("张三","001"));
		aggregate.addStudent(new Student("李四","002"));
		aggregate.addStudent(new Student("王五","003"));
		aggregate.addStudent(new Student("赵六","004"));
		//遍历对象
		//获取迭代器对象
		StudentIterator iterator = aggregate.getStudentIterator();
		while(iterator.hasNest()){
			System.out.println(iterator.next());
		}
	}
}

运行:

在这里插入图片描述

3、总结

优点:

  • 支持以不同的方式遍历一个容器,如以上的一个具体迭代器是按顺序依次取,可定义个新的迭代器实现类去用(按需写next方法逻辑)
    在这里插入图片描述

  • 引入迭代器,聚合类(容器类)不用再自行提供数据遍历的方法

  • 有抽象层的存在,再加个新的迭代器依旧符合开闭

适用场景:

  • 需为容器类提供多种遍历方式(多个迭代器的实现类)
  • 需为遍历不同结构的容器类提供一个统一的接口
  • 当访问一个容器对象的元素,而不能暴露其内部结构细节

4、在源码中的实际应用

JDK中集合类的迭代器:

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator(); //list.iterator()方法返回的肯定是Iterator接口的子实现类对象
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
  • List:抽象聚合类
  • ArrayList:具体的聚合类
  • Iterator:抽象迭代器
  • list.iterator():返回的是实现了 Iterator 接口的具体迭代器对象

源码:

在这里插入图片描述

Itr是一个内部类,属于具体的迭代器类,实现了Iterator接口,并重写了next、hasNext方法。自己开发迭代器的话,也只需实现java.util.Iterator接口即可,类比上面的ArrayList。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

厚膜高压电阻器应用

EAK高压厚膜电阻器可用于广泛的应用。其中包括电源、配电系统、ESD 保护、电子显微镜、空气电离设备、雷达设备、X 射线发生器和 ATE。 示例电路包括高压泄放器、电压平衡、电压调节和分压器。在这篇文章中&#xff0c;我们将讨论选择电阻器时要考虑的关键问题。 电压泄放电路…

IDEA开启Run Dashboard

1、Run Dashboard是什么&#xff0c;为什么要使用 Run Dashboard 是 IntelliJ IDEA 中的一个工具窗口&#xff0c;用于管理和监视项目中正在运行的应用程序和配置。它提供了一种集中管理运行和调试过程的方式&#xff0c;可以让开发人员更方便地查看和控制正在运行的应用程序。…

CSAPP Malloc lab

CSAPP Malloc Lab 目标 实现一个简单的动态存储分配器。 评分标准 空间利用率应当减少internal 和 external fragmentation. memory utilization memory utilization payload / heap size fragmentation internal fragmentation external fragmentation throughput T 越接…

vue中ref 根据多选框所选数量,动态地变换box的高度

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

如何调整yolo混淆矩阵的大小,使其更加美观

1、找到xxx/utils/metrics.py 2、找到这个函数 3、往下拉找到这里&#xff0c;自己对照改一下 import seaborn as snarray self.matrix / ((self.matrix.sum(0).reshape(1, -1) 1E-9) if normalize else 1) # normalize columnsarray[array < 0.005] np.nan # dont a…

分布式之Sentinel使用和源码分析

Sentinel使用和源码分析 1、服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题&#xff0c;调用这个服务就会出现线程阻塞的情况&#xff0c;此时若有大量的请求涌入&#xff0c;就会出现多条线程阻塞等待&#xff…

Redirect相应重定向无法访问WEB-INF下的静态资源,可以跳到外部资源(比如www.baidu.com)

相应重定向无法访问WEB-INF目录下静态资源&#xff0c;WEB-INF目录下静态资源受保护。 访问外部资源 访问Servlet5.do&#xff0c;就跳到百度页面

【快速上手ProtoBuf】proto 3 语法详解

1 &#x1f351;字段规则&#x1f351; 消息的字段可以⽤下⾯⼏种规则来修饰&#xff1a; singular &#xff1a;消息中可以包含该字段零次或⼀次&#xff08;不超过⼀次&#xff09;。 proto3 语法中&#xff0c;字段默认使⽤该规则。repeated &#xff1a;消息中可以包含该…

二,几何相交---4,BO算法---(3)数据结构

数据结构分两块&#xff0c;一个是某一时间状态的局部相交线段。一个是事件队列&#xff0c;是某一时刻局部相交线段的集合。

【Java设计模式】十九、中介者模式

文章目录 1、中介者模式2、案例3、总结 1、中介者模式 如图&#xff1a; 同事类之间关联较多时&#xff0c;整体出现网状结构&#xff0c;耦合度极高。一个对象一变动&#xff0c;好多对象都得改。若变为右边的星形结构&#xff0c;则一个类的变动&#xff0c;只影响自身与中介…

Vulnhub - DevGuru

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DevGuru 靶机下载地址&#xff1a;DevGuru: 1 ~ VulnHub 目录 0x01 信息收集 0x02 Web漏洞利用 - W…

Ansible管理主机的清单------------inventory

一、 Ansible组成 INVENTORY&#xff1a;Ansible管理主机的清单 /etc/ansible/hosts 需要管理的服务清单,(将你需要管理的主机 、地址 或者名字 写入此文件) MODULES&#xff1a;Ansible执行命令的功能模块&#xff0c;多数为内置核心模块&#xff0c;也可自定义 PLUGINS&…

掌握抽象基础之20个必备原则,看完你还不会,你打我

抽象基础之20个必备原则 1. 面向对象编程&#xff08;OOP&#xff09;中抽象原则背后的基本思想是什么&#xff1f;2.抽象和封装的区别&#xff1f;3.提供一个现实生活中说明抽象的例子4.在编程语言中如何实现抽象&#xff1f;5.定义抽象类6.提供一个抽象类的真实世界场景7.解释…

大数据赋能,能源企业的智慧转型之路

在数字洪流中&#xff0c;大数据已经成为推动产业升级的新引擎。特别是在能源行业&#xff0c;大数据的应用正引领着一场深刻的智慧转型。今天&#xff0c;我们就来探讨大数据如何在能源企业中发挥其独特的魅力&#xff0c;助力企业提效降本&#xff0c;实现绿色发展。 动态监控…

学生时期学习资源同步-1 第一学期结业考试题5

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…

软考高级:系统工程方法(霍尔三维结构、切克兰德方法等)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Python+Selenium 自动化 - 开发环境搭建

PythonSelenium 自动化 - 开发环境搭建 一、Python 下载与安装二、Geany 代码编辑工具下载与安装三、代码运行演示 一、Python 下载与安装 Python 官网&#xff1a;https://www.python.org/ 首先在官网下安装包。 建议选择稳定版本&#xff0c;我这里下载的是 3.12.2 版本。 …

C++Qt学习——添加资源文件

目录 1、创建好了文件之后&#xff0c;在左边空白处按下CtrlN&#xff0c;创建Qt 以及Qt Resource File 2、写入名称&#xff0c;点击下一步 3、可以发现已经创建好啦。 4、点击Add Prefix 5、写上前缀&#xff0c;最好加上斜杠 6、选择提前放好的图片或者icon 7、发…

2024最新修复版独立付费进群系统源码全开源

1、修复SQL表 2、修复支付文件 3、修复支付图标不显示 4、修复定位、分销逻辑、抽成逻辑 5、新增支持源支付、易支付的支付接口 6、修复官方微信、支付宝支付接口文件 本来早就可以完工的&#xff0c;被99ai群里的几个傻逼耽搁了&#xff0c;做好自己就行了&#xff0c;这…