设计模式——行为型模式(二)

6.8 迭代器模式

6.8.1 概述

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

6.8.2 结构

迭代器模式主要包含以下角色:

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

6.8.3 案例实现

【例】定义一个可以存储学生对象的容器对象,将遍历该容器的功能交由迭代器实现,涉及到的类如下:

代码如下:

定义迭代器接口,声明hasNext、next方法

class Student {private String name;private String number;public Student(String name, String number) {this.name = name;this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", number='" + number + '\'' +'}';}
}
//抽象迭代器角色接口
interface StudentIterator {boolean hasNext();Student next();
}
//具体迭代器角色类
class StudentIteratorImpl implements StudentIterator {private List<Student> list;private int position = 0;public StudentIteratorImpl(List<Student> list) {this.list = list;}@Overridepublic boolean hasNext() {return position < list.size();}@Overridepublic Student next() {Student currentStudent = list.get(position);position++;return currentStudent;}
}
interface StudentAggregate {void addStudent(Student student);void removeStudent(Student student);StudentIterator getStudentIterator();
}
class StudentAggregateImpl implements StudentAggregate {private List<Student> list = new ArrayList<Student>();  // 学生列表@Overridepublic void addStudent(Student student) {this.list.add(student);}@Overridepublic void removeStudent(Student student) {this.list.remove(student);}@Overridepublic StudentIterator getStudentIterator() {return new StudentIteratorImpl(list);}
}
class Client{public static void main(String[] args) {//创建聚合对象StudentAggregateImpl studentAggregate = new StudentAggregateImpl();//添加元素studentAggregate.addStudent(new Student("张三","1001001"));studentAggregate.addStudent(new Student("李四","1001002"));studentAggregate.addStudent(new Student("王二","1001003"));studentAggregate.addStudent(new Student("麻子","1001004"));//遍历聚合对象StudentIterator studentIterator = studentAggregate.getStudentIterator();while(studentIterator.hasNext()){Student student = studentIterator.next();System.out.println(student.toString());}}
}

Student{name='张三', number='1001001'}
Student{name='李四', numbe

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

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

相关文章

C# Onnx PP-Vehicle 车辆分析(包含:车辆检测,识别车型和车辆颜色)

目录 效果 模型信息 mot_ppyoloe_s_36e_ppvehicle.onnx vehicle_attribute_model.onnx 项目 代码 下载 其他 C# Onnx PP-Vehicle 车辆分析&#xff08;包含&#xff1a;车辆检测&#xff0c;识别车型和车辆颜色&#xff09; 效果 模型信息 mot_ppyoloe_s_36e_ppvehi…

009 OpenCV 二值化 threshold

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中&#xff0c;OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理&#xff0c;以此大幅降低图像的数…

【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。 用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击) 自定义阴影遮罩Mask&#xff1a; from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

leetcode:合并两个有序链表

题目描述 题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 这个算法思路很简单&#xff1a;就是直接找小尾插 定义一个tail和head&#xff0c;对比两个链表结点的val&#xff0c;小的尾插到tail->next&#xff0c;如果一个链表…

每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

企业微信身份验证

本篇主要是在上一篇获取第三方凭证基础上&#xff0c;用户通过三方网站自定义授权登录后获取用户信息&#xff0c;以实现用户绑定登录功能。 构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息&#xff0c; 第一步需要构造如下的链接来获取授权c…

马养殖场建设VR模拟实训教学平台具有灵活性和复用性

为保障养殖场生物安全&#xff0c;避免疫病传播&#xff0c;学生出入养殖场受时间和地域的限制&#xff0c; 生产实习多以参观为主&#xff0c;通过畜牧企业技术人员的讲解&#xff0c;学生被动了解生产过程。为了解决畜牧养殖实训难的问题&#xff0c;借助VR技术开展畜牧养殖虚…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂&#xff0c;为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况&#xff0c;本文以航次1个钻孔&#xff08;U1403&#xff09;为例&#xff0c;更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图&#xff0c;从图中的颜色效果可以看出&#xff0c;此多波束的成…

归并排序算法

文章目录 归并排序一、归并排序思路二、归并排序算法模板三、题目代码 归并排序 一、归并排序思路 二、归并排序算法模板 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;//中间值merge_sort(q, l, mid);merge_sort(q, mid 1, r);…

大数据分析与应用实验任务九

大数据分析与应用实验任务九 实验目的 进一步熟悉pyspark程序运行方式&#xff1b; 熟练掌握pysaprkRDD基本操作相关的方法、函数&#xff0c;解决基本问题。 实验任务 进入pyspark实验环境&#xff0c;打开命令行窗口&#xff0c;输入pyspark&#xff0c;完成下列任务&am…

Redis入门教程

1. 什么是NoSql NoSQL一词最早出现于1998年&#xff0c;是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年&#xff0c;Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论&#xff0c;来自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

编程参考 - C++ Code Review: 一个计算器的项目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1&#xff0c;拿到一个project&#xff0c;第一眼看&#xff0c;没有配置文件&#xff0c;说明没有引入持续集成系统&#xff0c;continuous integration system。 2&#xff0c;然后看cmake文件&#xff0c;使用的子…

使用Python的turtle模块绘制钢铁侠图案

1.1引言&#xff1a; 在Python中&#xff0c;turtle模块是一个非常有趣且强大的工具&#xff0c;它允许我们以一个可视化和互动的方式学习编程。在本博客中&#xff0c;我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令&#xff0c;我们可以引导turtle绘制出指定的图…

CrystalDiskInfo/CrystalDiskMark/DiskGenius系统迁移

CrystalDiskInfo 主要用于看硬盘的各种信息&#xff0c;包括但不限于硬盘通电时间、通电次数、硬盘好坏状态 CrystalDiskMark 主要用于测试硬盘的读写速度、连续读写速度 DiskGenius 主要用于通过U盘装操作系统后进行&#xff0c;磁盘分区&#xff0c;更改磁盘名、隐藏部分…

案例014:Java+SSM+uniapp+mysql基于微信小程序的健身管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

SpringBoot:ch02 配置文件(日志)

前言 简单介绍 Spring Boot 中常见的配置文件类型&#xff0c;如 application.properties 和 application.yml 等&#xff0c;并说明它们各自的特点和用途。 一、前期准备 1、新建项目&#xff0c;结构如下 2、添加依赖 <?xml version"1.0" encoding"UTF…

单片机语音芯片开发要解决的问题

在单片机语音芯片开发过程中&#xff0c;可能会遇到多种问题&#xff0c;这些问题可能来自于技术层面&#xff0c;也可能来自于芯片本身的设计和应用层面。下面让我们具体从芯片的功耗、语音识别的准度、芯片的尺寸和芯片的可靠性四个方面开展讨论。 1.芯片的功耗问题 首先&a…