【设计模式-4.5】行为型——迭代器模式

说明:本文介绍设计模式中,行为型设计模式之一的迭代器模式。

定义

迭代器模式(Iterator Pattern),也叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内元素的组成结构。(引自《设计模式就该这样学》P329)

行车记录仪场景

假设有一个行车记录仪对象,可存储行车记录时的视频,可存储10个视频,超出会覆盖最早的数据,如下:

/*** 行车记录仪*/
public class DrivingRecorder {/*** 当前记录的位置*/private int index = -1;/*** 假设只能存储10个视频*/private String[] records = new String[10];/*** 存入*/public void append(String record) {// 如果当前位置已经到达末尾,就从头开始存储if (index == 9) {index = 0;} else {index++;}records[index] = record;}/*** 顺序遍历*/public void display() {for (int i = 0; i < 10; i++) {System.out.println(i + ":" + records[i]);}}/*** 按照存入顺序逆序遍历* 从新=>旧读取*/public void displayByOrder() {// loopCount:是集合能存储的数据个数,故不能大于10;// i是记录的位置,存的时候+1,读的时候-1,并且还要做==0判断,如果==0,就从集合末尾开始读;for (int i = index, loopCount = 0; loopCount < 10; i = i == 0 ? 9 : i - 1, loopCount++) {System.out.println(records[i]);}}
}

运行如下,可见存入12个视频,把前面存储的两个视频数据覆盖了。

在这里插入图片描述

分析
(1)无法读取到行车记录仪中的数据(即变量records),当然我们可以开放对应的get方法,但这样设计遍历和读取数据方法不免有重复(现成的index变量还没用上,不可惜嘛?),我们能否扩展遍历方法,返回当前位置上的数据?;

(2)代码不够优雅,对于一个封闭的对象或者说容器,遍历对象内的数据,我们是否可以考虑抽出成一个接口,定义遍历的规范,使其他对象实现其接口。

迭代器设计

针对上面行车记录仪场景,改造成迭代器设计模式,如下:

import java.util.Iterator;/*** 行车记录仪(迭代器设计)*/
public class DrivingRecorderIterable implements Iterable<String> {/*** 当前记录的位置*/private int index = -1;/*** 假设只能存储10个视频*/private String[] records = new String[10];/*** 存入*/public void append(String record) {// 如果当前位置已经到达末尾,就从头开始存储if (index == 9) {index = 0;} else {index++;}records[index] = record;}@Overridepublic Iterator<String> iterator() {return new Itr();}/*** 行车记录仪迭代器*/private class Itr implements Iterator<String> {/*** cursor:游标,这里通过赋值拷贝一份,不要直接使用index,不然一边读一边写的时候会出错* loopCount:是集合能存储的数据个数,故不能大于10*/int cursor = index;int loopCount = 0;@Overridepublic boolean hasNext() {return loopCount < 10;}@Overridepublic String next() {int i = cursor;if (i == 9) {i = 0;} else {i++;}cursor = i;loopCount++;return records[i];}}
}

这里使用的接口是JDK自带的Iterator,实现该接口的类都能使用上述方式遍历数据。

在这里插入图片描述

Java中的单列集合,Collection,实现了该接口,也就是说实现了Collection接口的容器,都支持这种迭代器的遍历方式。

在这里插入图片描述

像ArrayList

        List<String> list = new ArrayList<>();list.add("王麻子");list.add("小李子");list.add("李爱花");Iterator<String> iterator = list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}

使用场景

在《设计模式就该这样学》(P330)这本书中,提到迭代器模式适用于以下场景:

(1)访问一个集合对象的内容而无须暴露它的内部表示。

(2)为遍历不同的集合结构提供一个统一的访问接口;


结合上述行车记录仪场景,如果你需要访问一个对象中的数据,又不想开放对应数据的get方法,就可以考虑迭代器模式。

总结

本文介绍了行为型设计模式中的迭代器模式,参考《设计模式就该这样学》、《秒懂设计模式》两书,行车记录仪场景是《秒懂设计模式》中的举例,非常形象,容易理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OSUniApp自定义手势识别与操作控制实践#三方框架 #Uniapp

UniApp自定义手势识别与操作控制实践 引言 在移动应用开发中&#xff0c;手势交互已经成为提升用户体验的重要组成部分。本文将深入探讨如何在UniApp框架中实现自定义手势识别与操作控制&#xff0c;通过实际案例帮助开发者掌握这一关键技术。我们将以一个图片查看器为例&…

【数据结构】树形结构--二叉树

【数据结构】树形结构--二叉树 一.知识补充1.什么是树2.树的常见概念 二.二叉树&#xff08;Binary Tree&#xff09;1.二叉树的定义2.二叉树的分类3.二叉树的性质 三.二叉树的实现1.二叉树的存储2.二叉树的遍历①.先序遍历②.中序遍历③.后序遍历④.层序遍历 一.知识补充 1.什…

从认识AI开始-----解密LSTM:RNN的进化之路

前言 我在上一篇文章中介绍了 RNN&#xff0c;它是一个隐变量模型&#xff0c;主要通过隐藏状态连接时间序列&#xff0c;实现了序列信息的记忆与建模。然而&#xff0c;RNN在实践中面临严重的“梯度消失”与“长期依赖建模困难”问题&#xff1a; 难以捕捉相隔很远的时间步之…

接地气的方式认识JVM(一)

最近在学jvm&#xff0c;浮于表面的学了之后&#xff0c;发现jvm并没有我想象中的那么神秘&#xff0c;这篇文章将会用接地气的方式来说一说这些jvm的相关概念以及名词解释。 带着下面两个问题来阅读 认识了解JVM大致有什么在代码运行时的都在背后做了什么 JVM是个啥&#xf…

Next.js 15 与 Apollo Client 的现代集成及性能优化

Next.js 15 与 Apollo Client 的现代集成及性能优化 目录 技术演进集成实践性能优化应用案例未来趋势 技术演进 Next.js 15 核心特性对开发模式的革新 Next.js 15 通过引入 App Router、服务器组件&#xff08;Server Components&#xff09;和客户端组件&#xff08;Clie…

无人机桥梁3D建模、巡检、检测的航线规划

无人机桥梁3D建模、巡检、检测的航线规划 无人机在3D建模、巡检和检测任务中的航线规划存在显著差异&#xff0c;主要体现在飞行高度、航线模式、精度要求和传感器配置等方面。以下是三者的详细对比分析&#xff1a; 1. 核心目标差异 任务类型主要目标典型应用场景3D建模 生成…

Hive数据倾斜问题深度解析与实战优化指南

一、数据倾斜现象的本质与危害 数据倾斜是Hive在MapReduce计算过程中,​部分Key对应的数据量远超其他Key,导致少数Reducer任务处理时间远高于其他任务的性能瓶颈问题。典型表现为: ​作业进度卡在99%​​:99%的Reducer已完成,剩余1%持续数小时​资源利用率失衡​:部分节…

VRRP 原理与配置:让你的网络永不掉线!

VRRP 原理与配置&#xff1a;让你的网络永不掉线&#xff01; 一. VRRP 是什么&#xff0c;为什么需要它&#xff1f;二. VRRP 的核心概念三. VRRP 的工作原理四. 华为设备 VRRP 配置步骤 &#xff08;主备模式&#xff09;4.1 拓扑示例4.2 &#x1f6e0; 配置步骤 五. VRRP 配…

解决开发者技能差距:AI 在提升效率与技能培养中的作用

企业在开发者人才方面正面临双重挑战。一方面&#xff0c;IDC 预测&#xff0c;到2025年&#xff0c;全球全职开发者将短缺400万人&#xff1b;另一方面&#xff0c;一些行业巨头已暂停开发者招聘&#xff0c;转而倚重人工智能&#xff08;AI&#xff09;来满足开发需求。这不禁…

痛点即爆点?如何挖掘客户的痛点和需求?

销售的核心在于精准洞察客户需求与痛点&#xff0c;并运用专业能力为其提供定制化解决方案&#xff0c;从而消除客户顾虑、解决问题&#xff0c;最终实现双赢。而快速识别客户痛点&#xff0c;不仅是成交的关键&#xff0c;更是建立专业形象、赢得客户信任的核心能力。那么&…

云服务器如何自动更新系统并保持安全?

云服务器自动更新系统是保障安全、修补漏洞的重要措施。下面是常见 Linux 系统&#xff08;如 Ubuntu、Debian、CentOS&#xff09;和 Windows 服务器自动更新的做法和建议&#xff1a; 1. Linux 云服务器自动更新及安全维护 Ubuntu / Debian 系统 手动更新命令 sudo apt up…

fvm install 下载超时 过慢 fvm常用命令、flutter常用命令

Git 配置问题 确保 Git 使用的是 HTTPS&#xff0c;而不是 SSH。如果你有 .gitconfig&#xff0c;确保没有配置奇怪的代理&#xff1a; git config --global --get http.proxy git config --global --get https.proxy如果有代理设置且不需要&#xff0c;取消代理&#xff1a;…

多语种OCR识别系统,引领文字识别新时代

在全球化与数字化深度融合的今天&#xff0c;语言障碍成为企业跨国协作、信息管理的一大挑战。无论是跨国合同签署、多语言档案管理&#xff0c;还是跨境商务沟通&#xff0c;高效精准的文字识别技术已成为刚需。中安智能OCR多语种识别系统应运而生&#xff0c;凭借其强大的光学…

Pyenv 使用指南:多版本 Python 环境管理

目录 Pyenv 是什么&#xff1f;安装 Pyenv管理 Python 版本虚拟环境管理项目级 Python 版本控制高级技巧常见问题解决最佳实践 Pyenv 是什么&#xff1f; Pyenv 是一个强大的 Python 版本管理工具&#xff0c;允许你&#xff1a; 在同一台机器上安装多个 Python 版本轻松切换…

Windows 11 家庭版 安装Docker教程

Windows 家庭版需要通过脚本手动安装 Hyper-V 一、前置检查 1、查看系统 快捷键【winR】&#xff0c;输入“control” 【控制面板】—>【系统和安全】—>【系统】 2、确认虚拟化 【任务管理器】—【性能】 二、安装Hyper-V 1、创建并运行安装脚本 在桌面新建一个 .…

leetcode:479. 最大回文数乘积(python3解法,数学相关算法题)

难度&#xff1a;简单 给定一个整数 n &#xff0c;返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大&#xff0c;所以返回它对 1337 取余 。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;987 解释&#xff1a;99 x 91 9009, 9009 % 1337 …

VR看房系统,新生代看房新体验

VR看房系统的概念 虚拟现实&#xff08;VirtualReality,VR&#xff09;看房系统&#xff0c;是近年来随着科技进步在房地产行业中兴起的一种创新看房方式。看房系统利用先进的计算机技术模拟出一个三维环境&#xff0c;使用户能够身临其境地浏览和体验房源&#xff0c;无需亲自…

栈与队列:数据结构的有序律动

在数据结构的舞台上&#xff0c;栈与队列宛如两位优雅的舞者&#xff0c;以独特的节奏演绎着数据的进出规则。它们虽不像顺序表与链表那般复杂多变&#xff0c;却有着令人着迷的简洁与实用&#xff0c;在众多程序场景中发挥着不可或缺的作用。今天&#xff0c;就让我们一同去探…

Flutte ListView 列表组件

目录 1、垂直列表 1.1 实现用户中心的垂直列表 2、垂直图文列表 2.1 动态配置列表 2.2 for循环生成一个动态列表 2.3 ListView.builder配置列表 列表布局是我们项目开发中最常用的一种布局方式。Flutter中我们可以通过ListView来定义列表项&#xff0c;支持垂直和水平方向展示…

跟Gemini学做PPT-模板样式的下载

好的&#xff0c;这里有一些推荐的网站&#xff0c;您可以在上面找到PPT目录样式和模板的灵感&#xff1a; SlideModel (slidemodel.com) 提供各种预先设计的目录幻灯片模板。这些模板100%可编辑&#xff0c;可用于PowerPoint和Google Slides。您可以找到不同项目数量&#xff…