设计模式十七:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种访问聚合对象(例如列表、集合、数组等)中各个元素的方法,而无需暴露其内部表示。迭代器模式将遍历元素和访问元素的责任分离开来,使得代码更加灵活、可扩展和易于维护。
迭代器模式的核心思想是抽象出一个迭代器接口,该接口定义了访问和遍历元素的方法,然后不同的聚合对象实现这个接口以提供自己的迭代器。这样,客户端代码就可以通过迭代器遍历聚合对象中的元素,而无需关心聚合对象的具体实现细节。

迭代器的使用场景

迭代器模式在许多情况下都可以发挥作用,特别是在需要遍历和访问集合或聚合对象的场景中。以下是一些常见的使用场景:

  1. 遍历集合类:
    迭代器模式最典型的用途就是遍历集合类(如列表、集合、数组等)中的元素,而无需暴露集合的内部结构。这可以让你在遍历过程中保持代码的清晰性和灵活性。
  2. 封装集合的底层实现:
    迭代器模式可以将集合的底层实现与遍历操作分离开,从而让你可以更换或升级集合的底层实现,而不影响遍历代码。
  3. 支持不同的遍历方式:
    如果你希望支持不同的遍历方式,例如前向、后向、跳跃等,你可以通过实现不同的迭代器来达到目的。
  4. 隐藏复杂的遍历逻辑:
    如果集合中的元素存储方式比较复杂,或者遍历逻辑比较繁琐,你可以通过迭代器模式将这些复杂性隐藏起来,让客户端代码更加简洁。
  5. 支持多线程安全的遍历:
    在多线程环境中,使用迭代器模式可以实现安全的遍历操作,避免多个线程同时访问集合造成的问题。
  6. 遍历数据库查询结果
    当从数据库中获取查询结果时,你可以使用迭代器模式遍历查询结果集,从而逐个处理每条记录。
  7. 遍历文件系统目录:
    在处理文件系统目录结构时,你可以使用迭代器模式遍历目录中的文件和子目录。
  8. 访问组合模式中的对象:
    在组合模式中,你可以使用迭代器模式遍历组合对象中的叶子节点和容器节点。

迭代器模式的主要角色

  1. 迭代器接口(Iterator):定义访问和遍历元素的方法,抽象出了迭代器的行为。
  2. 具体迭代器(ConcreteIterator):实现迭代器接口,负责实际遍历聚合对象的元素。
  3. 聚合接口(Aggregate):定义获取迭代器的方法,抽象出聚合对象的行为
  4. 具体聚合(ConcreteAggregate):实现聚合接口,负责创建具体的迭代器。

迭代器模式的java实现实例

public class Book {
    private String title;

    public Book(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }
}
package cn.iterator.service;

import java.util.Iterator;

public class BookCollection implements Iterable<Book> {
    private Book[] books;
    private int size;

    public BookCollection(int capacity) {
        books = new Book[capacity];
        size = 0;
    }

    public void addBook(Book book) {
        if (size < books.length) {
            books[size++] = book;
        }
    }

    @Override
    public Iterator<Book> iterator() {
        return new BookIterator();
    }

    // 自定义迭代器
    private class BookIterator implements Iterator<Book> {
        private int currentIndex = 0;

        @Override
        public boolean hasNext() {
            return currentIndex < size;
        }

        @Override
        public Book next() {
            return books[currentIndex++];
        }
    }
}
public class Iterator {
    public static void main(String[] args) {
        BookCollection bookCollection = new BookCollection(3);
        bookCollection.addBook(new Book("Java Programming"));
        bookCollection.addBook(new Book("Design Patterns"));
        bookCollection.addBook(new Book("Data Structures"));
        // 使用迭代器遍历书籍集合
        for (Book book : bookCollection) {
            System.out.println("Book Title: " + book.getTitle());
        }
    }

}

当执行到
for(Book book : bookCollection)会有两步操作
在这里插入图片描述
1.判断是否有下一个数据
在这里插入图片描述
2.返回下一个数据
在这里插入图片描述

迭代器模式的优缺点

迭代器模式在许多情况下能够提供更好的代码组织和可维护性,但也需要权衡其引入的复杂性和性能问题。在设计时需要根据具体情况来判断是否使用迭代器模式以及如何使用
优点:

  1. 分离遍历逻辑
    迭代器模式将遍历和访问元素的逻辑与聚合对象的具体实现分离开来,使客户端代码更加简洁,减少了与元素遍历相关的重复代码。
  2. 支持多种遍历方式:
    通过实现不同的迭代器,可以轻松支持不同的遍历方式,如正向遍历、逆向遍历、跳跃遍历等,而不需要改变客户端代码。
  3. 隐藏聚合对象的内部结构:
    迭代器模式可以将聚合对象的内部结构隐藏起来,提高了聚合对象的封装性和安全性,同时避免了直接暴露实现细节。
  4. 可替换性和灵活性:
    由于客户端代码只依赖于迭代器接口,而不依赖于具体的聚合对象,因此可以轻松地替换不同的聚合对象和迭代器实现,以适应不同的需求和变化。
  5. 适用于各种聚合对象:
    迭代器模式适用于各种聚合对象,无论是数组、链表、集合还是自定义的聚合类型,都可以通过实现迭代器来提供统一的遍历方式。

缺点:

  1. 增加了类的数量:
    引入迭代器模式会增加额外的类和接口,从而增加了代码的复杂性,特别是对于简单的聚合对象而言,可能会显得过于繁琐。
  2. 可能引起性能问题:
    在某些情况下,使用迭代器模式可能会引起性能问题,特别是在遍历大量数据时。迭代器模式需要维护迭代器对象,可能会造成一定的开销。
  3. 不适合每种情况:
    尽管迭代器模式适用于大多数需要遍历聚合对象的情况,但并不是所有场景都适合使用。对于一些简单的遍历操作,直接使用循环可能更加简单直接。

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

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

相关文章

ArrayList

目录 1.ArrayList简介 2.ArrayList的构造 2.1ArrayList() 2.2ArrayList(Collection c) 2.3ArrayList(int initialCapacity) 3.ArrayList常见操作 4.ArrayList的遍历的遍历 1.ArrayList简介 在集合框架中&#xff0c; ArrayList 是一个普通的类&#xff0c;实现了 List…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件&#xff0c;然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同&#xff0c;但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

学习笔记整理-DOM-02-事件监听

一、什么是"事件监听" DOM允许书写JavaScript代码以让HTML元素对事件作出反应什么是"事件": 用户与网页的交互动作当用户点击元素时当鼠标移动到元素上时当文本框的内容被改变时当键盘在文本框中被按下时当网页已加载完毕时… “监听”&#xff0c;顾名思义…

6.利用matlab完成 符号矩阵的秩和 符号方阵的逆矩阵和行列式 (matlab程序)

1.简述 利用M文件建立矩阵 对于比较大且比较复杂的矩阵&#xff0c;可以为它专门建立一个M文件。下面通过一个简单例子来说明如何利用M文件创建矩阵。 例2-2 利用M文件建立MYMAT矩阵。(1) 启动有关编辑程序或MATLAB文本编辑器&#xff0c;并输入待建矩阵&#xff1a;(2) 把…

Centos 防火墙命令

查看防火墙状态 systemctl status firewalld.service 或者 firewall-cmd --state 开启防火墙 单次开启防火墙 systemctl start firewalld.service 开机自启动防火墙 systemctl enable firewalld.service 重启防火墙 systemctl restart firewalld.service 防火墙设置开…

【mysql】事务的四种特性的理解

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

Leetcode33 搜索旋转排序数组

题解&#xff1a; /*** 旋转排序数组可分为N1 N2两个部分&#xff0c;如&#xff1a;[4,5,6,7,1,2,3]&#xff0c;N1为[4,5,6,7]&#xff0c;N2为[1,2,3]** 必然满足以下两个条件&#xff1a;* 1. N1和N2都是分别递增的&#xff1b;* 2. N1中的所有元素大于N2中的所有元素;** …

研发协同工具哪个好用?比较常用的研发协同工具及其特点

Zoho Projects是一款在线的SaaS研发协同工具&#xff0c;支持敏捷开发/DevOps/Scrum等项目协作&#xff0c;最大的特点就是“会说话”&#xff0c;意思是&#xff1a;它可以把在项目协作过程中重要和相关的消息和信息通过恰到好处的方式告诉你&#xff0c;解决&#xff1a;开发…

Mac OS minicom 无法设置921600问题

MacOS minicom 无法设置921600问题 介绍过程解决方案参考资料 介绍 minicom是Mac上一款非常好用的串口工具。本文假设你已经安装minicom&#xff0c;并且知道minicom的一般配置和使用方法。这是“MacOS minicom 无法设置921600”的解决问题记录。它在以下环境中设置成功&#…

HarmonyOS NEXT新能力,一站式高效开发HarmonyOS应用

2023年8月6日华为开发者大会2023&#xff08;HDC.Together&#xff09;圆满收官&#xff0c;伴随着HarmonyOS 4的发布&#xff0c;华为向开发者发布了汇聚所有最新开发能力的HarmonyOS NEXT开发者预览版&#xff0c;并分享了围绕“一次开发&#xff0c;多端部署” “可分可合&a…

安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

docker compose部署zookeeper

单机部署 新建docker-compose.yaml version: 3 services:zookeeper:image: zookeeper:3.5.7container_name: base-zookeeperhostname: zookeeperprivileged: truerestart: alwaysports:- 2181:2181environment:TZ: "Asia/Shanghai"volumes:- ./volumes/zookeeper/d…

Python 处理 Excel 表格的 14 个常用操作

目录 1. 安装依赖库 2. 导入库 3. 读取Excel文件 4. 写入Excel文件 5. 创建工作表 6. 访问工作表 7. 读取单元格数据 8. 写入单元格数据 9. 获取行数和列数 10. 过滤数据 11. 排序数据 12. 添加新行 13. 删除行或列 14. 计算汇总统计 总结 无论是数据分析师、财…

实习笔记(一)

自定义注解&#xff1a; 自定义注解中有三个元注解Target,Retention,Document /*** 系统日志注解** author Mark sunlightcsgmail.com*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface SysLog {String value() default "…

『C语言初阶』第八章 -隐式类型转换规则

前言 今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则&#xff0c;在C语言中类型转换方式可分为隐式类型转换和显式类型转换(强制类型转换)&#xff0c;其中隐式类型转换是由编译器自动进行&#xff0c;无需程序员干预&#xff0c;今天小羊课堂说的就是关于隐式类型转换…

Splashtop 获得 ISO 27001 认证

2023年8月15日 加利福尼亚州库比蒂诺 Splashtop 在随处办公远程解决方案领域处于领先地位&#xff0c;该公司今天宣布已获得 ISO/IEC 27001 认证&#xff0c;印证了其对坚持最高标准的信息安全管理系统&#xff08;ISMS&#xff09;、为客户提供数据保护以及遵守法律法规要求的…

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…

矿井下无人值守变电所电力监控系统的探讨与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功…

[Blender]Geometry nodes altermesh to UE

首先要先下载插件 AlterMesh – Use geometry nodes inside Unreal 下载对应版本的插件后 打开UE&#xff0c;在对应的设置里面挂上blender.exe的路径 去官方下载一个Blender Geometry nodes 的示例 Demo Files — blender.org​​​​​​