设计模式行为型——迭代器模式
什么是迭代器模式
迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。
迭代器模式的实现
迭代器模式角色
- 抽象迭代器角色(Iterator):定义遍历元素所需要的方法,通常包含next()、hasNext()、remove()等。
- 具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
- 容器角色(Aggregate):一般是接口,定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
- 具体容器角色(ConcreteAggregate):抽象容器的具体实现类,实现抽象容器,创建出容器迭代器的对象。
迭代器模式类图
迭代器模式代码实现
抽象迭代器角色
package com.common.demo.pattern.iterator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象迭代器角色 抽象迭代器* @date 2023/08/03 22:38:43*/
public interface Iterator {//判断是否还有下一个元素boolean hasNext();//获取第一个元素Object first();//获取下一个元素Object next();
}
具体迭代器角色
package com.common.demo.pattern.iterator;import java.util.List;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体迭代器角色 对象迭代器* @date 2023/08/03 22:39:30*/
public class ObjectIterator implements Iterator{private List<Object> list;//记录遍历时的位置private int position = 0;public ObjectIterator(List<Object> list) {this.list = list;}@Overridepublic boolean hasNext() {return position<list.size();}@Overridepublic Object first() {return list.get(0);}@Overridepublic Object next() {return list.get(position++);}
}
抽象容器角色
package com.common.demo.pattern.iterator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象聚合/容器角色* @date 2023/08/03 22:43:07*/
public interface Aggregate {//添加对象void addObject(Object object);//移除对象void removeObject(Object object);//获取迭代器Iterator getIterator();
}
具体容器角色
package com.common.demo.pattern.iterator;import java.util.ArrayList;
import java.util.List;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体聚合/容器角色 对象聚合* @date 2023/08/03 22:43:31*/
public class ObjectAggregate implements Aggregate{private List<Object> list = new ArrayList<>();@Overridepublic void addObject(Object object) {list.add(object);}@Overridepublic void removeObject(Object object) {list.remove(object);}@Overridepublic Iterator getIterator() {return new ObjectIterator(list);}
}
测试类
package com.common.demo.pattern.iterator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 测试类* @date 2023/08/03 22:44:47*/
public class Test {public static void main(String[] args) {//创建聚合对象ObjectAggregate objectAggregate = new ObjectAggregate();//在聚合对象中填充数据objectAggregate.addObject("我是好人一号");objectAggregate.addObject("我是好人二号");objectAggregate.addObject("我是好人三号");//获取迭代器Iterator iterator = objectAggregate.getIterator();//通过迭代器迭代数据while (iterator.hasNext()){System.out.println(iterator.next());}}
}
测试截图

迭代器模式的特点
优点
- 简化集合遍历代码:迭代器模式可以封装集合对象的遍历过程,使得客户端代码更简洁清晰,无需关心集合对象的内部表示和遍历方式。
- 支持多种遍历方式:通过定义不同的迭代器类,可以实现对同一个聚合对象的不同遍历方式,灵活地应对不同的需求。
- 封装聚合对象的内部表示:迭代器将遍历操作从聚合对象中抽离出来,使得聚合对象可以更好地封装自己的内部数据结构。
缺点
- 增加了系统复杂性:引入迭代器模式将会增加额外的类和接口,增加了系统的复杂性和理解难度。
- 需要额外的内存开销:每个迭代器对象都需要占用一定的内存空间,当迭代器数量较多时,会增加系统的内存开销。
使用场景
- 需要遍历聚合对象的情况:当需要遍历访问一个聚合对象的元素,并且对外部隐藏其内部表示时,可以考虑使用迭代器模式。
- 需要支持多种遍历方式的情况:当同一聚合对象需要支持多种不同的遍历方式时,可以使用迭代器模式来实现。
注意事项
- 迭代器模式一般包括迭代器接口和具体迭代器实现类,以及聚合对象和具体聚合对象类。在使用迭代器模式时,需要注意它们之间的关系和协作。
- 聚合对象需要提供创建迭代器对象的接口,以便客户端能够获取迭代器对象进行遍历操作。
- 注意迭代器对象的生命周期管理,特别是在多线程环境下,需要注意迭代器的线程安全性和一致性。
- 考虑迭代器模式的性能影响,尤其是对于大规模数据集合的遍历操作,需要合理评估迭代器模式的适用性和性能开销。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)
相关文章:
设计模式行为型——迭代器模式
什么是迭代器模式 迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…...
K8s持久化存储(nfs网络存储)
数据卷 emptydir,是本地存储,pod重启,数据就不存在了,需要对数据持久化存储 1.nfs,网络存储 ,pod重启,数据还存在的...
常规VUE项目优化实践,跟着做就对了!
总结: 主要优化方式: imagemin优化打包大小(96M->50M),但是以打包速度为代价,通过在构建过程中压缩图片来实现,可根据需求开启。字体压缩:目前项目内引用为思源字体,…...
PLL 的 verilog 实现
锁相环(PLL)是一种常用的频率、相位追踪算法,在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍,随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示,主要由鉴相器、环路滤…...
【Hystrix技术指南】(1)基本使用和配置说明
这世间许多事物皆因相信而存在,所以人们亲手捏出了泥菩萨,却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被…...
Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)
业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...
【leetcode】394. 字符串解码
题目链接:力扣 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没…...
系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...
魅族Pandaer手机壳
Pandaer的设计真是非常好看啊!像是手机壳的花样就特别多,还分出来很多系列,我比较喜欢它的亮面设计,入手了一款iPhone的,花色叫做“失控街头”,壳内部也是亮的,看起来特别浮夸,潮里潮…...
F5洞察2023年网络威胁,助力网络安全防护
2023已经过半,关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说,应当对相关的前瞻分析有所了解。前段时间,我阅读了F5 安全运营中心工程师对威胁网络安全的预测,深受启发,故此选取了几则…...
从零构建深度学习推理框架-4 框架中的算子注册机制
今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式,所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构,维护了一组键值对,key是对应的OpType,用来查找对应的value,…...
使用vscode+ssh免密远程Linux
使用vscodessh免密远程Linux 使用 SSH 密钥对:使用 SSH Agent:ssh-agent的使用场景 使用 SSH 密钥对: 确保你的本地机器上已经生成了 SSH 密钥对。如果没有,请使用以下命令生成密钥对: ssh-keygen -t rsa这将在 ~/.ssh…...
rust-异步学习
rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的:除非它们运行起来,否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时,它会尝试把…...
【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常
azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行,连接邮箱服务器IP限制,也就是黑名单,释放时间不确定,但至少一天及以上。 解决办法,换一个IP,或者新注册一个office365邮箱再重试。 以下是…...
重新登录成功和登录失败处理器
<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…...
【Spring】(三)Spring 使用注解存储和读取 Bean对象
文章目录 前言一、使用注解储存 Bean 对象1.1 配置扫描路径1.2 类注解储存 Bean 对象1.2.1 Controller(控制器存储)1.2.2 Service(服务储存)1.2.3 Repository(仓库存储)1.2.4 Component(组件储存…...
ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决
ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中,具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的࿱…...
---------------- 部署 Zookeeper 集群 ----------------
部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…...
SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁
😀前言 本篇博文是关于SpringBoot 依赖管理和自动配置,希望能够帮助到您😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您…...
c语言每日一练(2)
前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
AMD新平台装CentOS7.9总报Kernel Panic?别折腾了,试试Rocky Linux 9.2吧
AMD新平台安装CentOS7.9遭遇Kernel Panic?Rocky Linux 9.2的完美替代方案 最近几年,AMD的Zen3架构处理器凭借出色的性能和能效比,赢得了大量开发者和技术爱好者的青睐。然而,当这些用户尝试在Ryzen 5000系列平台上安装某些较旧的L…...
远程服务器Jupyter Notebook安全配置全攻略
1. 为什么需要远程Jupyter Notebook? 很多数据分析师和开发者都遇到过这样的困扰:本地的电脑性能有限,跑个大型数据集就卡成PPT;出差时想调取公司服务器的代码,却发现环境配置复杂到怀疑人生。这时候,远程J…...
终极Label Studio数据标注指南:从零开始构建AI训练数据集
终极Label Studio数据标注指南:从零开始构建AI训练数据集 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/label-studio …...
EcomGPT-中英文-7B电商模型在Vue.js前端项目中的集成:打造实时智能客服聊天组件
EcomGPT-中英文-7B电商模型在Vue.js前端项目中的集成:打造实时智能客服聊天组件 最近在做一个电商后台的升级项目,客户提了个需求,希望能在用户端和管理后台都加上一个智能客服,能实时回答商品咨询、订单状态这些常见问题。一开始…...
UBANTU安装Duckietown细节操作与错误记录
一,安装 1.虚拟机安装VM,安装UBUNTU系统,按照VMware虚拟机安装Ubuntu教程(超详细)_vmware安装ubuntu-CSDN博客 去操作就可以,绝对详细,而且不坑。 2.个人建议使用搜狗输入法。 3.打开系统文件夹 例如我的叫tuoni&a…...
文献阅读 260404-Effect of climate warming on the timing of autumn leaf senescence reverses after ...
Effect of climate warming on the timing of autumn leaf senescence reverses after the summer solstice 来自 <https://www.science.org/doi/10.1126/science.adf5098> ## Abstract: Structured Abstract INTRODUCTION Ongoing climate change is causing rapid shif…...
闻达:高效LLM调用平台的完整使用指南
闻达:高效LLM调用平台的完整使用指南 【免费下载链接】wenda 闻达:一个LLM调用平台。目标为针对特定环境的高效内容生成,同时考虑个人和中小企业的计算资源局限性,以及知识安全和私密性问题 项目地址: https://gitcode.com/gh_m…...
HarmonyOS 6实战:HarmonyOS轻量化交互的两种方案改造与实践(上)
HarmonyOS 6实战:HarmonyOS轻量化交互的两种姿势(上篇)一、服务卡片:AI助手实现常驻系统页服务卡片改造实战踩坑记录二、实况窗:更新位置与进程服务(mock版)生命周期管理踩坑记录总结我们之前做…...
Java 并发编程封神!从入门到精通,面试再也不怕被问爆
目录 synchronized 支持重入吗?如何实现的? syncronized锁升级的过程讲一下 JVM对Synchornized的优化? 介绍一下AQS CAS 和 AQS 有什么关系? 如何用 AQS 实现一个可重入的公平锁? Threadlocal作用,原理&#x…...
告别重复编码:用autoclaw在快马平台一键生成数据模型类提升效率
最近在开发一个Web应用时,我又遇到了那个老问题:每次新建数据表后,都要手动编写对应的模型类代码。这种重复劳动不仅耗时,还容易因为手误导致字段类型不匹配等问题。直到发现了InsCode(快马)平台的autoclaw功能,我的开…...
