设计模式——迭代器模式(Iterator)
迭代器模式(Iterator Pattern)是一种行为设计模式,它使得我们能够顺序地访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式为遍历不同的聚合结构提供了一个统一的接口,使得客户端代码可以独立于聚合对象的变化。
迭代器模式结构
迭代器模式主要由以下几个角色组成:
- 迭代器(Iterator):定义访问和遍历元素的接口。
- 具体迭代器(Concrete Iterator):实现迭代器接口,并跟踪遍历中的当前位置。
- 聚合(Aggregate):定义创建迭代器对象的接口。
- 具体聚合(Concrete Aggregate):实现聚合接口,返回一个具体迭代器的实例。
- 客户端(Client):持有对聚合对象和迭代器的引用,并调用迭代器的接口来遍历聚合对象。
迭代器模式优点
- 支持以不同方式遍历一个聚合:通过提供不同的迭代器,可以支持不同的遍历方式。
- 简化聚合的接口:聚合对象不再需要暴露其内部表示,只需要提供一个创建迭代器的方法。
- 对聚合对象的修改更加安全:因为客户端代码是通过迭代器来访问聚合对象的,所以聚合对象的内部表示可以被隐藏和保护起来。
迭代器模式示例
假设我们有一个BookCollection(书籍集合)类,它包含多个Book对象。我们想要遍历这个集合并访问其中的每一本书。我们可以使用迭代器模式来实现这个功能。
聚合接口和具体聚合
// 聚合接口
interface BookCollection {Iterator<Book> createIterator();
}// 具体聚合
class MyBookCollection implements BookCollection {private List<Book> books = new ArrayList<>();// 添加书籍到集合中public void addBook(Book book) {books.add(book);}// 创建迭代器@Overridepublic Iterator<Book> createIterator() {return new BookIterator(books.iterator());}
}
迭代器接口和具体迭代器
// 迭代器接口
interface Iterator<T> {boolean hasNext();T next();
}// 具体迭代器
class BookIterator implements Iterator<Book> {private Iterator<Book> iterator;public BookIterator(Iterator<Book> iterator) {this.iterator = iterator;}@Overridepublic boolean hasNext() {return iterator.hasNext();}@Overridepublic Book next() {return iterator.next();}
}
客户端代码
// 客户端代码
public class Client {public static void main(String[] args) {BookCollection bookCollection = new MyBookCollection();bookCollection.addBook(new Book("Java设计模式"));bookCollection.addBook(new Book("C++编程思想"));// 获取迭代器并遍历集合Iterator<Book> iterator = bookCollection.createIterator();while (iterator.hasNext()) {Book book = iterator.next();System.out.println(book.getTitle());}}
}// Book类(示例用)
class Book {private String title;public Book(String title) {this.title = title;}public String getTitle() {return title;}
}
在上面的示例中,我们定义了一个BookCollection接口和一个MyBookCollection具体聚合类,以及一个Iterator接口和一个BookIterator具体迭代器类。客户端代码通过调用MyBookCollection的createIterator方法来获取一个迭代器,并使用这个迭代器来遍历集合中的书籍。这样,我们就实现了迭代器模式。
相关文章:
设计模式——迭代器模式(Iterator)
迭代器模式(Iterator Pattern)是一种行为设计模式,它使得我们能够顺序地访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式为遍历不同的聚合结构提供了一个统一的接口,使得客户端代码可以独立…...
在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示
🐇明明跟你说过:个人主页 🏅个人专栏:《Grafana:让数据说话的魔术师》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …...
【JavaScript】内置对象 - 数组对象 ③ ( 数组反转 - reverse 方法 | 数组排序 - sort 方法 | 自定义数组排序规则 )
文章目录 一、数组排序1、翻转数组元素 - reverse()2、数组元素排序 - sort() 默认从小到大排序3、数组元素排序 - sort() 自定义排序规则4、数组元素排序 - sort() 自定义降序排序简化写法 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript…...
ctfshow web入门 php反序列化 web267--web270
web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…...
智慧公厕解决什么问题?实现了什么样的价值?
公共厕所一直是城市管理的难题,常常面临着卫生条件不佳、管理不善以及使用体验差等问题。为了解决这些困扰城市的难题,智慧公厕应运而生。智慧公厕不仅应用了信息化和数字化技术,还通过全方位的智能化应用,彻底改变了传统公厕的面…...
IATF16949认证是什么?
IATF16949认证是一项国际质量管理体系的认证标准,由国际汽车行业联合会(IATF)开发,旨在提高汽车行业的质量管理水平,满足客户对汽车部件和零部件的要求。该标准是在ISO/TS 16949标准的基础上,专门为汽车行业…...
【Vue2】关于response返回数据的错误小记
关于Vue2中response返回数据的一个错误小记 如图,在这里返回的时候,后端是通过List< String >返回的,response接收到的实际上是一个Array数组,但是赋值给searchedTaskList的时候,需要在.then包括的范围里面赋值给…...
深入理解C++构造函数和析构函数
目录标题 1. 构造函数默认构造函数参数化构造函数拷贝构造函数 2. 析构函数3. 构造函数和析构函数的使用场景自动资源管理防止资源泄露深拷贝和浅拷贝 4. C的类中必定有个构造函数吗?5. 总结 C中的构造函数和析构函数是类对象生命周期管理的重要组成部分。构造函数用…...
CMakeLists.txt语法规则:数学运算 math
一. 简介 前面几篇文章学习了 CMakeLists.txt语法中的一些常用变量,常用命令,双引号的作用。条件判断语句,循环语句等等。 本文简单学习一下 CMakeLists.txt语法中数学运算 match。 二. CMakeLists.txt语法规则:数学运算 math 在…...
图片无损压缩工具-VIKY
一、前言 Viky v3.4是一款功能强大的图片压缩工具,它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法,该软件在显著减小图片文件大小的同时,还保持了图像的清晰度和色彩饱和度,确保了图像质量的优异表现。 二、软件特点…...
【Linux操作系统】:文件操作
目录 前言 一、C语言中文件IO操作 1.文件的打开方式 2.fopen:打开文件 3.fread:读文件 4.fwrite:写文件 二、系统文件I/O 1.系统调用open、read、write 2.文件描述符fd 3.文件描述符的分配规则 4.重定向 5.缓冲区 6.理解文件系统 磁盘 磁盘…...
渗透之sql注入----二次注入
目录 二次注入的原理: 实战: 第一步:找注入点 找漏洞: 注入大概过程: 第二步:开始注入 二次注入的原理: 二次注入是由于对用户输入的数据过滤不严谨,导致存在异常的数据被出入…...
LeetCode 每日一题 ---- 【2105. 给植物浇水 II】
LeetCode 每日一题 ---- 【2105. 给植物浇水 II】 2105.给植物浇水II方法:模拟双指针 2105.给植物浇水II 方法:模拟双指针 今天是给植物浇水II,昨天是I,本质上和昨天的没有区别,都是模拟,今天额外需要注意…...
【刷题】代码随想录算法训练营第三十五天|435、无重叠区间,763、划分字母区间 ,56、合并区间
目录 435、无重叠区间763、划分字母区间56、合并区间 435、无重叠区间 讲解:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 左边界和有边界排序,注意sort的排序规则函数编写。 class Solution { public:// 按照…...
【JVM】了解JVM规范中的虚拟机结构
目录 JVM规范的主要内容 1)字节码指令集(相当于中央处理器CPU) JVM指令分类 2)Class文件的格式 3)数据类型和值 4)运行时数据区 5)栈帧 6)特殊方法 7)类库 JVM规范的主要内容 1&#…...
西藏在线教育系统哪家好,培训机构为什么讲师流动大?该如何留住讲师?
教育机构的核心竞争力其实还是产品竞争力,老师讲什么,这是教研团队在做的;老师如何讲,这是师资团队来做的;如何交付给学生,这是产品团队来做的,如果你有在线的团队的话,三个部分共同构成了整个产品…...
智能文档提取
识别饼状图、条形图转化为json字段 GitHub - LingyvKong/OneChart: official code for "OneChart: Purify the Chart Structural Extraction via One Auxiliary Token"...
封装Springboot基础框架功能-03
在些模块中汇总了一些web开发常用的配置和功能。 模块源码结构 Restful API常用定义 QueryParam请求参数 Data public class QueryParam {private String key;private String value; }RestfulController实现 RestfulController.java,主要汇总一些常用的restful的…...
汽车EDI:IAC Elmdon EDI 对接指南
近期收到客户C公司的需求,需要与其合作伙伴IAC Elmdon建立EDI连接,本文将主要为大家介绍IAC Elmdon EDI 对接指南,了解EDI项目的对接流程。 项目需求 传输协议:OFTP2 IAC Elmdon 与其供应商之间使用的传输协议为OFTP2。OFTP2是…...
IPFoxy:什么是静态住宅IP?静态ISP代理指南
静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…...
别再纠结硬件滚动了!用Arduino+SSD1306库实现超长文本的软件滚动显示(附完整代码)
ArduinoSSD1306实现超长文本流畅滚动的终极方案 当你在创客项目中需要显示超出屏幕宽度的日志数据或长消息时,硬件滚动的局限性就会暴露无遗。我曾在一个环境监测项目中遇到这个问题——传感器数据经常超过OLED屏幕的16字符显示限制,硬件滚动方案直接截断…...
Qwen2-VL-2B-Instruct在Qt桌面应用中的集成:开发跨平台图像分析工具
Qwen2-VL-2B-Instruct在Qt桌面应用中的集成:开发跨平台图像分析工具 1. 引言 如果你是做桌面应用开发的,特别是用C和Qt的,最近可能也注意到了AI模型带来的新机会。很多开发者都在想,怎么把这些强大的AI能力,比如看图…...
从手机照片同步到数据去重:用C++ STL set/map搞定‘两个数组交集’背后的真实业务逻辑
从手机照片同步到数据去重:用C STL set/map搞定‘两个数组交集’背后的真实业务逻辑 每次换新手机时,最头疼的莫过于照片和联系人的迁移——那些重复的截图、相似的风景照、多年前的证件照,究竟该如何高效筛选?这背后隐藏的正是计…...
告别单行代码:在Python IDLE中编写完整函数的完整指南
告别单行代码:在Python IDLE中编写完整函数的完整指南 对于刚接触Python的开发者来说,IDLE是一个既熟悉又陌生的环境。熟悉是因为它随Python安装包一起提供,陌生则是因为很多人仅仅把它当作一个简单的交互式Shell,而忽略了它作为完…...
Clipy:macOS效率工具中的自动化剪贴板增强专家
Clipy:macOS效率工具中的自动化剪贴板增强专家 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 你是否曾遇到这样的窘境:刚复制的重要文本被新内容覆盖,不得不重新打开…...
避坑指南:rviz多点导航插件编译失败?可能是你的ROS版本或消息类型不匹配
避坑指南:rviz多点导航插件编译失败?可能是你的ROS版本或消息类型不匹配 当你满怀期待地从GitHub克隆了一个功能强大的rviz多点导航插件,准备为自己的机器人系统增添顺序导航能力时,却遭遇了令人沮丧的编译错误——这种经历对于RO…...
【仅限首批内测用户开放】Polars 2.0清洗性能调优白皮书:含12个未公开API、3类CPU亲和性绑定策略
第一章:Polars 2.0大规模数据清洗技巧概览Polars 2.0 在性能、内存效率与API一致性上实现重大升级,为TB级结构化数据清洗提供了低延迟、高吞吐的原生解决方案。其基于Arrow 15的列式引擎、零拷贝切片能力及多线程LazyFrame执行计划优化,使复杂…...
Windows下用CMake和MinGW编译NLopt 2.6.2的完整指南(附测试代码)
Windows平台下NLopt 2.6.2源码编译与实战应用全解析 在科学计算与工程优化领域,NLopt作为一款开源的非线性优化库,因其丰富的算法支持和跨平台特性而广受欢迎。本文将深入探讨如何在Windows系统中从零开始构建NLopt 2.6.2开发环境,并通过完整…...
3个步骤掌握163MusicLyrics:多平台歌词提取与管理完全指南
3个步骤掌握163MusicLyrics:多平台歌词提取与管理完全指南 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾为找不到老歌的歌词而翻遍全网?…...
Python3.8环境配置全攻略:从零开始搭建你的第一个项目
Python3.8环境配置全攻略:从零开始搭建你的第一个项目 1. 为什么选择Python3.8环境 Python3.8作为Python3系列的一个重要版本,引入了多项新特性,包括海象运算符(:)、位置参数限定符(/)等语法改进,同时在性能上也有显著提升。对于…...
