迭代器模式 (Iterator Pattern)
文章目录
- 迭代器模式 (Iterator Pattern)
- 原理
- 优点
- 缺点
- 示例代码
- 场景描述
- 1. 定义迭代器接口
- 2. 定义集合接口
- 3. 实现具体集合类
- 4. 客户端代码
- 输出结果
- UML 类图
- 使用场景
- 优化与扩展
- 小结
迭代器模式 (Iterator Pattern)
迭代器模式是一种 行为型设计模式,用于顺序访问集合对象中的元素,而无需暴露集合的内部表示。它提供了一种统一的方式来遍历不同类型的集合。
原理
- 核心思想:
- 将集合的遍历逻辑封装在迭代器对象中,分离集合对象的存储和迭代行为。
- 适用场景:
- 需要访问集合对象中的内容,而不希望暴露其内部结构。
- 需要以不同方式遍历集合。
- 提供一个统一接口,支持多种类型集合的迭代。
- 参与角色:
- Iterator(迭代器接口):
- 定义访问和遍历元素的方法。
- ConcreteIterator(具体迭代器):
- 实现迭代器接口,负责具体的遍历行为。
- Aggregate(集合接口):
- 定义创建迭代器的接口。
- ConcreteAggregate(具体集合):
- 实现集合接口,并返回具体的迭代器。
- Iterator(迭代器接口):
优点
- 单一职责原则:
- 集合类负责存储数据,迭代器负责遍历,分离了职责。
- 开放/封闭原则:
- 可以新增不同的迭代方式,而无需修改集合类。
- 统一接口:
- 不同集合的遍历方式对外统一。
缺点
- 开销:
- 如果集合很大,创建多个迭代器对象可能会增加内存开销。
- 访问限制:
- 某些高级操作(如随机访问)可能不适用于简单迭代器。
示例代码
场景描述
设计一个自定义集合类 CustomCollection,并提供一个迭代器来遍历其中的元素。
1. 定义迭代器接口
// 迭代器接口
public interface Iterator<T> {boolean hasNext(); // 是否还有下一个元素T next(); // 获取下一个元素
}
2. 定义集合接口
// 集合接口
public interface Aggregate<T> {Iterator<T> createIterator(); // 创建迭代器
}
3. 实现具体集合类
import java.util.ArrayList;
import java.util.List;// 具体集合类
public class CustomCollection<T> implements Aggregate<T> {private List<T> items = new ArrayList<>();// 添加元素public void add(T item) {items.add(item);}// 获取元素public T get(int index) {return items.get(index);}// 获取集合大小public int size() {return items.size();}// 创建迭代器@Overridepublic Iterator<T> createIterator() {return new CustomIterator();}// 具体迭代器类private class CustomIterator implements Iterator<T> {private int index = 0; // 当前索引@Overridepublic boolean hasNext() {return index < items.size();}@Overridepublic T next() {return items.get(index++);}}
}
4. 客户端代码
public class IteratorPatternExample {public static void main(String[] args) {// 创建集合CustomCollection<String> collection = new CustomCollection<>();collection.add("Element 1");collection.add("Element 2");collection.add("Element 3");// 获取迭代器Iterator<String> iterator = collection.createIterator();// 使用迭代器遍历集合while (iterator.hasNext()) {System.out.println(iterator.next());}}
}
输出结果
Element 1
Element 2
Element 3
UML 类图
+----------------+| Aggregate |<-----------------++----------------+ || + createIterator(): Iterator<T> |+----------------+ |^ || |+---------------------------+ +-------------------+| CustomCollection<T> | | Iterator<T> |+---------------------------+ +-------------------+| - items : List<T> | | + hasNext(): bool || + add(item): void | | + next(): T || + createIterator(): CustomIterator<T> |+---------------------------+ +-------------------+^ ^| |+---------------------------+ +-------------------+| CustomIterator<T> | | Client |+---------------------------+ +-------------------+| - index : int | | + hasNext(): bool || + next(): T |+---------------------------+
使用场景
- 集合类的封装:
- 如 Java 中的
ArrayList,HashMap的迭代器。
- 如 Java 中的
- 多种遍历方式:
- 深度优先搜索和广度优先搜索可以使用不同的迭代器实现。
- 复杂对象的遍历:
- 需要以特定顺序访问复杂结构中的数据。
优化与扩展
- 支持多种遍历方式:
- 如反向迭代器、跳步迭代器等。
- 线程安全:
- 提供线程安全的迭代器(如
CopyOnWriteArrayList的迭代器)。
- 提供线程安全的迭代器(如
- 懒加载:
- 对于大集合,可以使用惰性迭代器按需加载数据。
小结
- 迭代器模式使得集合的遍历行为与集合内部结构解耦。
- 提供了统一的访问方式,但实现迭代器可能带来一定的额外开销。
- 在实际开发中,迭代器模式广泛应用于各种集合类的遍历操作,尤其是在框架设计中非常常见。
相关文章:
迭代器模式 (Iterator Pattern)
文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式,用于顺序访问集…...
039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)
(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public static DateTime startTime;[CommandM…...
如何将 GitHub 私有仓库(private)转换为公共仓库(public)
文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…...
C++11 右值引用
目录 左值 右值 左值引用与右值引用比较 左值引用总结: 右值引用总结: 左值引用的使用场景: 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板: 右值引用和移动语义解决上述问题: 下面就是有移动…...
WPS表格学习计划与策略
一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...
Android 引入 proto 项目及使用方法
Proto(Protocol Buffers)是Google开发的一种语言无关、平台无关的序列化结构数据的方法,它类似于JSON和XML,但相对于XML而言更小,相对于JSON而言解析更快,支持多语言。以下是将Proto引入Android项目的方法及…...
VSOMEIP主要流程的时序
请求服务: client应用: application_impl::request_service routing_manager_client::request_service (老版本是routing_manager_proxy) routing_manager_client::send_request_services protocol::request_service_command its_command; // 创建…...
右值引用和移动语义:
C 右值引用和移动语义详解 在 C 的发展历程中,右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言,一直在不断演进以满足现代软件编程的需求。…...
经纬高LLA转地心地固ECEF坐标,公式,代码
经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高,经纬高在slam系统里无法应用,slam系统一般是xyz互相垂直的笛卡尔坐标系,所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...
VUE前端实现天爱滑块验证码--详细教程
第一步: Git地址:tianai-captcha-demo: 滑块验证码demo 找到目录 src/main/resources/static,拷贝 static 并改名为 tac 即可。 第二步: 将改为 tac 的文件,放进项目根目录中,如下图: 第三步࿱…...
【链表】【删除节点】【刷题笔记】【灵神题单】
237.删除链表的节点 链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可! 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!摘自力扣评论区…...
springboot339javaweb的新能源充电系统pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…...
【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
python的文件操作练习
文件操作:成绩统计 有一个文件grades.txt,文件内容是每行一个学生的成绩(格式:姓名,成绩)。要求: 读取文件内容,统计所有学生的平均成绩; 将不及格(<60分)…...
jQuery九宫格抽奖,php处理抽奖信息
功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项,用户点击抽奖按钮后,九宫格开始旋转,最终停在一个随机位置上,此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为…...
2024年一级建造师考试成绩,即将公布!
一级建造师考试成绩一般在考试结束后3个月左右的时间公布! 根据官方通知,重庆、江苏、青海、江西、云南、湖南、福建、北京、山西、黑龙江等地在今年一建报名通知里提到:2024年一级建造师考试成绩预计于2024年12月上旬公布。考生可在这个时间…...
M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?
M4V 是一种视频文件格式,主要由苹果公司用于其产品和服务中,如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容,并且通常与苹果的 DRM(数字版权管理)技术结合使用,以限制内容的复制和…...
Leetcode 每日一题 104.二叉树的最大深度
目录 问题描述 示例 示例 1: 示例 2: 约束条件 题解 方法一:广度优先搜索(BFS) 步骤 代码实现 方法二:递归 步骤 代码实现 结论 问题描述 给定一个二叉树 root,我们需要返回其最大…...
文件上传漏洞:你的网站安全吗?
文章目录 文件上传漏洞攻击方式:0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…...
AWS账号提额
Lightsail提额 控制台右上角,用户名点开,选择Service Quotas 在导航栏中AWS服务中找到lightsail点进去 在搜索框搜索instance找到相应的实例类型申请配额 4.根据自己的需求选择要提额的地区 5.根据需求来提升配额数量,提升小额配额等大约1小时生效 Ligh…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
