当前位置: 首页 > news >正文

设计模式行为型——迭代器模式

什么是迭代器模式

        迭代器模式(Iterator Pattern)属于行为型模式,其提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。

迭代器模式的实现

迭代器模式角色

  1. 抽象迭代器角色(Iterator):定义遍历元素所需要的方法,通常包含next()、hasNext()、remove()等。
  2. 具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成对聚合对象的遍历,记录遍历的当前位置。
  3. 容器角色(Aggregate):一般是接口,定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
  4. 具体容器角色(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());}}
}

测试截图

迭代器模式的特点

优点

  1. 简化集合遍历代码:迭代器模式可以封装集合对象的遍历过程,使得客户端代码更简洁清晰,无需关心集合对象的内部表示和遍历方式。
  2. 支持多种遍历方式:通过定义不同的迭代器类,可以实现对同一个聚合对象的不同遍历方式,灵活地应对不同的需求。
  3. 封装聚合对象的内部表示:迭代器将遍历操作从聚合对象中抽离出来,使得聚合对象可以更好地封装自己的内部数据结构。

缺点

  1. 增加了系统复杂性:引入迭代器模式将会增加额外的类和接口,增加了系统的复杂性和理解难度。
  2. 需要额外的内存开销:每个迭代器对象都需要占用一定的内存空间,当迭代器数量较多时,会增加系统的内存开销。

使用场景

  1. 需要遍历聚合对象的情况:当需要遍历访问一个聚合对象的元素,并且对外部隐藏其内部表示时,可以考虑使用迭代器模式。
  2. 需要支持多种遍历方式的情况:当同一聚合对象需要支持多种不同的遍历方式时,可以使用迭代器模式来实现。

注意事项

  1. 迭代器模式一般包括迭代器接口和具体迭代器实现类,以及聚合对象和具体聚合对象类。在使用迭代器模式时,需要注意它们之间的关系和协作。
  2. 聚合对象需要提供创建迭代器对象的接口,以便客户端能够获取迭代器对象进行遍历操作。
  3. 注意迭代器对象的生命周期管理,特别是在多线程环境下,需要注意迭代器的线程安全性和一致性。
  4. 考虑迭代器模式的性能影响,尤其是对于大规模数据集合的遍历操作,需要合理评估迭代器模式的适用性和性能开销。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

相关文章:

设计模式行为型——迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;属于行为型模式&#xff0c;其提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;即不需要知道集合对象的底层表示。编程环境中非常常用的设计模式。 迭代…...

K8s持久化存储(nfs网络存储)

数据卷 emptydir&#xff0c;是本地存储&#xff0c;pod重启&#xff0c;数据就不存在了&#xff0c;需要对数据持久化存储 1.nfs&#xff0c;网络存储 &#xff0c;pod重启&#xff0c;数据还存在的...

常规VUE项目优化实践,跟着做就对了!

总结&#xff1a; 主要优化方式&#xff1a; imagemin优化打包大小&#xff08;96M->50M&#xff09;&#xff0c;但是以打包速度为代价&#xff0c;通过在构建过程中压缩图片来实现&#xff0c;可根据需求开启。字体压缩&#xff1a;目前项目内引用为思源字体&#xff0c…...

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…...

【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在&#xff0c;所以人们亲手捏出了泥菩萨&#xff0c;却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被…...

Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)

业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...

【leetcode】394. 字符串解码

题目链接&#xff1a;力扣 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没…...

系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

魅族Pandaer手机壳

Pandaer的设计真是非常好看啊&#xff01;像是手机壳的花样就特别多&#xff0c;还分出来很多系列&#xff0c;我比较喜欢它的亮面设计&#xff0c;入手了一款iPhone的&#xff0c;花色叫做“失控街头”&#xff0c;壳内部也是亮的&#xff0c;看起来特别浮夸&#xff0c;潮里潮…...

F5洞察2023年网络威胁,助力网络安全防护

2023已经过半&#xff0c;关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说&#xff0c;应当对相关的前瞻分析有所了解。前段时间&#xff0c;我阅读了F5 安全运营中心工程师对威胁网络安全的预测&#xff0c;深受启发&#xff0c;故此选取了几则…...

从零构建深度学习推理框架-4 框架中的算子注册机制

今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式&#xff0c;所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构&#xff0c;维护了一组键值对&#xff0c;key是对应的OpType&#xff0c;用来查找对应的value&#xff0c;…...

使用vscode+ssh免密远程Linux

使用vscodessh免密远程Linux 使用 SSH 密钥对&#xff1a;使用 SSH Agent&#xff1a;ssh-agent的使用场景 使用 SSH 密钥对&#xff1a; 确保你的本地机器上已经生成了 SSH 密钥对。如果没有&#xff0c;请使用以下命令生成密钥对&#xff1a; ssh-keygen -t rsa这将在 ~/.ssh…...

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的&#xff1a;除非它们运行起来&#xff0c;否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时&#xff0c;它会尝试把…...

【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常

azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行&#xff0c;连接邮箱服务器IP限制&#xff0c;也就是黑名单&#xff0c;释放时间不确定&#xff0c;但至少一天及以上。 解决办法&#xff0c;换一个IP&#xff0c;或者新注册一个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&#xff08;控制器存储&#xff09;1.2.2 Service&#xff08;服务储存&#xff09;1.2.3 Repository&#xff08;仓库存储&#xff09;1.2.4 Component&#xff08;组件储存…...

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中&#xff0c;具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…...

---------------- 部署 Zookeeper 集群 ----------------

部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…...

SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁

&#x1f600;前言 本篇博文是关于SpringBoot 依赖管理和自动配置&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…...

c语言每日一练(2)

前言&#xff1a; 每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...