Java实现迭代器模式

一、简介

1、定义

  迭代器模式(Iterator Pattern)是一种面向集合对象而生的行为设计模式。对于集合对象而言,会涉及对集合的添加和删除操作,也要支持遍历集合元素的操作。可以把遍历操作放在集合对象中,但这样做,集合对象就承担太多的责任了。面向对象设计原则中有一条就是单一职责原则,所以要尽可能地分离这些职责,用不同的类承担不同的责任,迭代器模式就是用迭代器类来承担遍历集合的职责。
  迭代器模式提供了一种方法顺序访问一个集合对象中的各个元素,而又无需暴露该集合对象的内部实现,这样既可以做到不暴露集合对象的内部结构,又可让外部代码透明地访问集合内部的数据。

2、命令模式的结构

迭代模式涉及以下几个角色:
迭代器(Iterator)接口:定义访问和遍历集合元素的抽象方法,通常包含 hasNext()、next() 等方法。
具体迭代器(Concretelterator)类:实现迭代器接口中所定义的方法,完成对集合对象的遍历,记录遍历的当前位置。
聚合(Aggregate)类:构建集合数据,返回一个具体迭代器的实例。
客户端(Client)类:调用聚合类,维护集合对象,通过迭代器遍历集合对象。

二、Java实现案例

1、概念实现案例

/**
 * @Description: 迭代器接口
 * @Date: 2025-01-10 10:41
 * @Author: gaoyufei
 **/
public interface Iterator {
    boolean hasNext();
    Object next();
}

import java.util.List;
/**
 * @Description: 具体迭代器类
 * @Date: 2025-01-10 10:42
 * @Author: gaoyufei
 **/
public class ConcreteIterator implements Iterator{
    private List<Object> items;
    private int position;
    public ConcreteIterator(List<Object> items){
        this.items=items;
    }
    @Override
    public boolean hasNext() {
        return position<items.size();
    }

    @Override
    public Object next() {
        return items.get(position++);
    }
}

import java.util.ArrayList;
import java.util.List;
/**
 * @Description: 聚合类
 * @Date: 2025-01-10 10:46
 * @Author: gaoyufei
 **/
public class Aggregate {
    private List<Object> items=new ArrayList<>();
    public void add(Object item){
        items.add(item);
    }
    public Iterator iterator(){
        return new ConcreteIterator(items);
    }
}

/**
 * @Description: 客户端
 * @Date: 2025-01-10 10:48
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        Aggregate aggregate=new Aggregate();
        aggregate.add("item 1");
        aggregate.add("item 2");
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

2、书架遍历案例

/**
 * @Description: 书
 * @Date: 2025-01-10 13:07
 * @Author: gaoyufei
 **/
public class Book {
    private String name;
    public Book(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

/**
 * @Description: 迭代器接口
 * @Date: 2025-01-10 13:08
 * @Author: gaoyufei
 **/
public interface Iterator<E> {
    boolean hasNext();
    E next();
}

/**
 * @Description: 书架迭代器类
 * @Date: 2025-01-10 13:10
 * @Author: gaoyufei
 **/
public class BookShelfIterator implements Iterator{
    private BookShelf bookShelf;
    private int index;
    public BookShelfIterator(BookShelf bookShelf){
        this.bookShelf=bookShelf;
        this.index=0;
    }
    @Override
    public boolean hasNext() {
        return index<bookShelf.getBooks().size();
    }
    @Override
    public Book next() {
        return bookShelf.getBooks().get(index++);
    }
}

import java.util.ArrayList;
import java.util.List;
/**
 * @Description: 书架(聚合类)
 * @Date: 2025-01-10 13:12
 * @Author: gaoyufei
 **/
public class BookShelf {
    private List<Book> books=new ArrayList<>();
    public void add(Book book){
        books.add(book);
    }
    public List<Book> getBooks() {
        return books;
    }
    public void setBooks(List<Book> books) {
        this.books = books;
    }
    public Iterator iterator(){
        return new BookShelfIterator(this);
    }
}

/**
 * @Description: 客户端
 * @Date: 2025-01-10 13:14
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        BookShelf bookShelf=new BookShelf();
        bookShelf.add(new Book("思考致富"));
        bookShelf.add(new Book("思考,快与慢"));
        Iterator iterator = bookShelf.iterator();
        while (iterator.hasNext()){
            Book book = (Book)iterator.next();
            System.out.println(book.getName());
        }
    }
}

3、班级学生遍历案例

import java.util.Objects;

/**
 * @Description: 学生类
 * @Date: 2025-01-10 13:42
 * @Author: gaoyufei
 **/
public class Student {
    private String name;
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

/**
 * @Description: 迭代器接口
 * @Date: 2025-01-10 13:43
 * @Author: gaoyufei
 **/
public interface Iterator<E> {
    boolean hasNext();
    E next();
}

import java.util.List;
/**
 * @Description: 学生迭代器实现
 * @Date: 2025-01-10 13:44
 * @Author: gaoyufei
 **/
public class StudentIterator implements Iterator{
    private List<Student> students;
    private int position;
    public StudentIterator(List<Student> students){
        this.students=students;
        this.position=0;
    }
    @Override
    public boolean hasNext() {
        return position<students.size();
    }
    @Override
    public Object next() {
        return students.get(position++);
    }
}

import java.util.ArrayList;
import java.util.List;
/**
 * @Description: 班级
 * @Date: 2025-01-10 13:47
 * @Author: gaoyufei
 **/
public class StudentClass {
    private List<Student> students=new ArrayList<>();
    public void add(Student student){
        this.students.add(student);
    }
    public void remove(Student student) {
        students.remove(student);
    }
    public Iterator iterator(){
        return new StudentIterator(students);
    }
}

/**
 * @Description: 客户端
 * @Date: 2025-01-10 13:50
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        StudentClass studentClass=new StudentClass();
        studentClass.add(new Student("张三"));
        studentClass.add(new Student("李四"));
        studentClass.add(new Student("王五"));
        studentClass.remove(new Student("王五"));
        Iterator<Student> iterator = studentClass.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next().getName());
        }
    }
}

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

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

相关文章

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…

【免费开源】积木JimuBI大屏集成ruoyiVue

JimuBI介绍 JimuBI 是一个JAVA语言的低代码数据可视化大屏BI产品&#xff0c;将大屏、仪表盘、移动面板、图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 这是JeecgBoot团队出品的另外一款报表产品&#xff0c;积木报表已经成为业内报表首先&#x…

mysql binlog 日志分析查找

文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…

如何在谷歌浏览器中使用安全沙箱

谷歌浏览器的沙箱机制是一种重要的安全功能&#xff0c;可以有效隔离浏览会话中的每个标签页和插件&#xff0c;以防止恶意软件攻击用户系统。本文将详细介绍如何在谷歌浏览器中启用和使用沙箱功能。 一、什么是谷歌浏览器沙箱&#xff1f; 谷歌浏览器的沙箱是一种安全机制&am…

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较

《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串&#xff0c;请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串&#xff0c; 并规定大小写是不同的字符&#xff0c;空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…

L1G5000 XTuner 微调个人小助手认知

使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 1 环境配置与数据准备步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境步骤 1. 安装 XTuner 修改提供的数据步骤 0. 创建一个新的文件夹用于存储微调数据步骤 1. 创建修改脚本步骤 2. 执行脚本步骤 3. 查看数据…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

springmvc执行分析

步骤分析 1.浏览器客户端携带请求路径&#xff0c;本案例中是“/hello”&#xff0c;通过 web.xml 中的前端控制器配置&#xff0c;发送请求到前端控制器(DispatcherServlet)&#xff0c;并加载 SpringMVC.xml 配置文件&#xff0c;将 HelloController 加载进IOC容器当中&…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)

流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式&#xff08;Singleton&#xff09; 游戏实现中的唯一对象 在游戏开发过程中…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

Solidity入门: 函数

函数 Solidity语言的函数非常灵活&#xff0c;可以进行各种复杂操作。在本教程中&#xff0c;我们将会概述函数的基础概念&#xff0c;并通过一些示例演示如何使用函数。 我们先看一下 Solidity 中函数的形式: function <function name>(<parameter types>) {in…

基于 Python 自动化接口测试(踩坑与实践)

文档&#xff1a;基于 Python 的自动化接口测试 目录 背景问题描述与解决思路核心代码修改点及其详细解释最终测试结果后续优化建议 1. 问题背景 本项目旨在使用 Python 模拟浏览器的请求行为&#xff0c;测试文章分页接口的可用性。测试目标接口如下&#xff1a; bashcoder…

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例

Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…