设计模式-行为型模式-迭代器模式
1.迭代器模式的定义
迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节;
在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者是基本职责,而后者是可以变化的,又是可以分离的,因此可以将遍历数据的行为从容器中抽取出来,封装到迭代器对象中,由迭代器来提供遍历数据的行为,这将简化聚合对象的设计,更加符合单一职责原则;
对于迭代器模式,设计时很少用到,但编码时经常用到,目前大多数编程语言中,迭代器已经成为一个基础的类库,直接能用来遍历集合对象;
1.1 迭代器模式的优缺点
优点
- 迭代器模式支持以不同方式遍历一个集合对象,在同一个集合对象上可以定义多种遍历方式,在迭代器模式中只需要用一个不同的迭代器来替换原有的迭代器,即可改变遍历算法,也可以自己定义迭代器的子类以支持新的遍历方式;
- 迭代器简化了集合类,原有的集合对象不需要再自行提供数据遍历等方法;
- 由于引入了抽象层,增加新的集合类和迭代器类都很方便,无需修改原有代码,满足基于接口编程而非实现和开闭原则;
缺点
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加了类的个数,增加了系统的复杂性;
- 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展;
1.2 迭代器模式的使用场景
- 减少程序中重复的遍历代码;
- 当需要为遍历不同的集合结构提供一个统一的接口时或当访问一个集合对象的内容而无需暴露其内部细节时;
2.迭代器模式的原理

- 抽象集合类(Aggregate):用于存储和管理元素对象,定义存储、添加、删除集合的功能,并且声明了一个 createIterator() 方法用于创建迭代器对象;
- 具体集合类(ConcreteAggregate):实现抽象集合类,返回一个具体迭代器的实例;
- 抽象迭代器类(Interator):定义访问和遍历集合元素的接口,通常包含 hasNext()、next() 等方法;
- 具体迭代器类(ConcreteIterator):实现抽象迭代器接口所定义的方法,完成对集合对象的遍历,同时记录遍历的当前位置;
3.迭代器模式的实现
【代码】
抽象迭代器
public interface IteratorIterator<E> {void reset(); //重置为第一个元素E next(); //获取下一个元素E currentItem(); //检索当前元素boolean hasNext(); //判断是否还有下一个元素存在
}
抽象集合
public interface ListList<E> {//获取迭代器对象的抽象方法(面向接口编程)IteratorIterator<E> Iterator();
}
具体迭代器
public class TopicIterator implements IteratorIterator<Topic> {//Topic数组private Topic[] topics;//记录存储位置private int position;public TopicIterator(Topic[] topics) {this.topics = topics;position = 0;}@Overridepublic void reset() {position = 0;}@Overridepublic Topic next() {return topics[position++];}@Overridepublic Topic currentItem() {return topics[position];}@Overridepublic boolean hasNext() {if(position >= topics.length){return false;}return true;}
}
抽象迭代器
public class TopicList implements ListList<Topic> {private Topic[] topics;public TopicList(Topic[] topics) {this.topics = topics;}@Overridepublic IteratorIterator<Topic> Iterator() {return new TopicIterator(topics);}
}
客户端
public class Client {public static void main(String[] args) {Topic[] topics = new Topic[4];topics[0] = new Topic("topic1");topics[1] = new Topic("topic2");topics[2] = new Topic("topic3");topics[3] = new Topic("topic4");TopicList topicList = new TopicList(topics);IteratorIterator<Topic> iterator = topicList.Iterator();while(iterator.hasNext()){Topic t = iterator.next();System.out.println(t.getName());}}
}相关文章:
设计模式-行为型模式-迭代器模式
1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节; 在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者…...
FRP代理(QUIC通信)实验
访问关系与TCP实验相同,配置不一样 服务端配置 客户端配置 通信数据...
项目依赖拉不下来卡着不动怎么办,node又不支持cnpm
如果你的项目依赖在拉取时卡住,可以尝试以下步骤来解决问题: 检查网络:确保你的网络连接稳定。如果可能,尝试使用 VPN 或更换网络。 使用镜像源: 对于 yarn,可以使用淘宝镜像: yarn confi…...
ansible--role
简介 roles是ansible,playbooks的目录的组织结构,将代码或文件进行模块化,成为roles的文件目录组织结构。 易读,代码可冲哟美好,层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...
SpinalHDL之数据类型(一)
本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...
Ansys Zemax | 什么是Sobol取样?
附件下载 联系工作人员获取附件 本文主要介绍了: 什么是Sobol取样? 和随机光线产生方法相比,Sobol取样有什么优点? Sobol取样有什么限制? 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...
vue3写一个无限树形菜单,递归组件
原本使用element plus的el-tree,可是他的UI不匹配,狠难改成自己想要的,所以只能自己去写一个,做法:使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...
3D建模主要使用哪些软件?有什么特点?
3D建模主要使用的软件多种多样,每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件: 1. Autodesk 3ds Max 概述:3ds Max是一款功能丰富的建模和动画软件,广泛用于电影、游戏和虚拟现实等领域。 特点:…...
Android Studio 加载多个FLutter项目
按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录,只选择主目录,下面的文件不要选 添加完成,点击ok后,会进行导入 最终导入成功...
SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座
数字化办公时代,企业升级 IT 基础设施,已不再是选择题,而是必答题。 数字化办公时代,企业为何要升级 IT 基础设施? 随着时代变化与科技进步,人们的工作方式也发生了巨大变化。如今,远程办公、全…...
l超市售货管理系统小程序的设计
管理员账户功能包括:系统首页,个人中心,会员管理,供应商信息管理,商品管理,出入库管理,公告管理,轮播图信息 微信端账号功能包括:系统首页,公告,…...
systemverilog、verilog的部分常用内部函数
1. $ceil 作用:将给定的实数或浮点数向上取整。示例:$ceil(3.2) 返回 4。 2. $floor 作用:将给定的实数或浮点数向下取整。示例:$floor(3.9) 返回 3。 3. $value$plusargs 作用:从命令行读取传递给仿真器的参数。…...
Python趣味绘图案例
文章目录 系列文章趣味绘图案例1. 绘制简单的正方形2. 绘制五角星3. 绘制同心圆4. 绘制彩虹弧5. 绘制螺旋线6. 绘制六边形7. 绘制花形图案8. 绘制波浪线9. 绘制柱状图10. 绘制饼图 系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Pyt…...
P3588 [POI2015] PUS
~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接 思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p,将输入的 x 1 ∼ k x_{1\sim k} x1∼k 连向 p p p,再将 p p p 连向区间内单的其他点,建完图后拓扑排…...
指针(四)
指针和数组笔试题解析 一维数组 字符数组 (没有\0) 字符数组(有\0) 重点讲一下printf("%d\n", strlen(*p)); 这个strlen函数中是从地址开始寻找,而非元素本身;假设计算的是元素本…...
0902,DEQUE,LIST,VECTOR
目录 01_vector.cc 02_vector.cc 作业 01STL包括哪些组件?各自具有哪些特点? 02 序列式容器包括哪些?他们之间有哪些异同? 03 下面程序有什么错误? 04 创建和初始化vector的方法,每种都给出一个实例…...
LeetCode 每日一题 2024/9/2-2024/9/8
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/2 3153. 所有数对中数位不同之和9/3 2708. 一个小组的最大实力值9/4 2860. 让所有学生保持开心的分组方法数9/5 3174. 清除数字9/6 3176. 求出最长好子序列 I9/7 3177. 求…...
Linux中的Vim文本编辑器
Linux中的Vim是一个非常强大的文本编辑器,它提供了丰富的命令来支持各种文本编辑操作。以下是一个Vim常用命令的详细总结,涵盖了基本操作、编辑命令、移动光标、查找替换、保存退出等多个方面。 一、基本操作 启动Vim vim:直接启动Vim编辑器…...
rancher搭建k8s及jenkins自动化部署
1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
