news 2026/3/11 0:42:40

二十三种设计模式(十六)--迭代器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二十三种设计模式(十六)--迭代器模式

迭代器模式

迭代器模式通过统一的接口解决元素遍历的问题, 屏蔽掉元素复杂的算法细节, 从而让调用者专注于实际业务的处理.
示例代码如下:

// 具体的元素实现classMessage{Stringtitle;StringContent;publicMessage(Stringtitle,Stringcontent){this.title=title;Content=content;}}classMassager{privateMessage[]msgArr=newMessage[5];privateintsize=0;publicbooleanaddMsg(Messagemsg){if(size<5){msgArr[size++]=msg;}else{returnfalse;}returntrue;}// 外部获取迭代器对象的入口MessageIteratorcreateIterator(){returnnewMessageIterator();}// 较为通用的迭代器接口, 也可以再定义其他内容publicinterfaceiterator{Messagenext();booleanhasNext();}// 迭代器具体实现, 这里采用最简实现方式, 实际根据业务需求确定迭代逻辑// 比如采用ArrayList, HashMap等多种方式存储的数据// 下一条取用逻辑都在这里封装, 这一部分对调用端隐藏.classMessageIteratorimplementsiterator{intcurIdx=0;@OverridepublicMessagenext(){returnmsgArr[curIdx++];}@OverridepublicbooleanhasNext(){returncurIdx<size;}}}

在这个示例中, 迭代器继承自统一的接口, 意味着我们可以从不同的角度封装各种各样的迭代器, 可以有多个迭代器实现
createIterator迭代器创建方法, 在这个示例中仅返回了唯一的迭代器, 实际上根据业务需求, 可以采用参数方式返回多种迭代器
还有一点需要注意的是, 这个示例中, 将迭代器的接口和实现都是采用内部类的方式实现的, 这样也是实际业务中常用的写法, 好处在于迭代器中可以自由访问各种各样的集合容器, 比如示例中的msgArr
如果不采用这种方式, 那么在迭代器创建时要传入容器, 便于迭代器实现遍历逻辑.

外部调用

publicclassIteratorPattern{publicstaticvoidmain(String[]args){Massagermsgr=newMassager();msgr.addMsg(newMessage("新闻","吴国近日将伐蜀"));msgr.addMsg(newMessage("天气预报","近日东吴有雨"));Massager.iterator iterator=msgr.createIterator();while(iterator.hasNext()){Messagemsg=iterator.next();System.out.println(msg.title+": "+msg.Content);}}}

迭代器模式实现的必要性不止于此

比如我有如下业务需求:
我有一个名言锦句阅读应用, 客户端不断地从服务器获取未曾阅读过的诗词锦句, 服务端面对大量的用户请求, 进行了三级缓存设计, 以应对大量频繁的病发请求. 针对每一个用户, 首先在Redis中存储10条数据, 当Redis中数据取完时, 会从MongoDB中取用下一组10条数据, MongoDB中则存储100条数据. 当MongoDB中的数据取完时, 再从MySQL数据库中取用下一组100条数据.

而我们具体的业务逻辑中, 只会通过next()方法不断取用下一条数据, 并不关心下一条数据来自哪里.

针对上述诉求, 就可以采用迭代器模式来实现具体的数据取用逻辑
当业务扩展时, 比如我们更换了数据库, 采用PostgreSQL, 不再用MongoDB了, 也只更新迭代器的数据取用逻辑即可, 业务层的next()获取数据逻辑可以做到万年不变.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 1:06:22

CSS逻辑属性:writing-mode与方向无关的布局深度解析

CSS逻辑属性&#xff1a;writing-mode与方向无关的布局深度解析 在全球化互联网时代&#xff0c;网页设计需同时支持从左到右&#xff08;LTR&#xff09;和从右到左&#xff08;RTL&#xff09;的书写系统&#xff0c;以及东亚语言的垂直排版需求。传统CSS布局依赖物理属性&a…

作者头像 李华
网站建设 2026/3/1 12:41:07

ComfyUI-LTXVideo视频水印技术深度解析:架构设计与源码实现

ComfyUI-LTXVideo视频水印技术深度解析&#xff1a;架构设计与源码实现 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 在LTXVideo技术解析的框架下&#xff0c;视频水印实现作为…

作者头像 李华
网站建设 2026/3/4 6:28:07

粘性定位(sticky)的实用技巧与限制

粘性定位(sticky)的实用技巧与限制 在Web开发的布局领域&#xff0c;CSS粘性定位&#xff08;position: sticky&#xff09;凭借其独特的定位机制&#xff0c;已成为实现滚动吸附效果的核心技术。它通过结合相对定位与固定定位的特性&#xff0c;在用户滚动页面时动态切换元素的…

作者头像 李华
网站建设 2026/3/5 1:14:23

使用Miniconda创建Python虚拟环境的最佳命名规范

使用Miniconda创建Python虚拟环境的最佳命名规范 在数据科学和AI开发的日常工作中&#xff0c;你是否曾遇到过这样的场景&#xff1a;服务器上列着十几个名为 test、env1、myproject 的Conda环境&#xff0c;却完全无法判断哪个对应当前正在训练的模型&#xff1f;又或者CI/CD流…

作者头像 李华
网站建设 2026/3/4 17:16:25

SQLBot智能问数平台部署指南:5步快速搭建企业级数据分析系统

SQLBot作为一款基于大语言模型和RAG技术的智能问数平台&#xff0c;为企业提供了开箱即用的智能数据分析能力。通过自然语言交互&#xff0c;用户可以轻松查询数据库、生成可视化图表&#xff0c;大幅降低数据分析门槛&#xff0c;是数字化转型的理想工具。 【免费下载链接】SQ…

作者头像 李华
网站建设 2026/2/12 2:32:52

通过内核驱动与命名管道实现Windows本地提权漏洞利用

安全研究人员正日益聚焦通过两大Windows攻击面实现提权攻击&#xff1a;内核驱动与命名管道。这些攻击载体利用了用户模式与内核模式间基础信任边界的弱点&#xff0c;使攻击者能够从标准用户权限提升至SYSTEM级访问。内核驱动攻击面内核驱动由于IOCTL&#xff08;输入/输出控制…

作者头像 李华