深入浅出Java设计模式之迭代器模式

HighScore3.0实战指南:XRD物相分析从入门到精通(持续更新版) 本文提供HighScore3.0软件进行XRD物相分析的完整实战指南。从软件设置、数据导入、背景扣除、寻峰等预处理步骤,到核心的Search & Match物相搜索匹配、Rietveld精修定量,以及结果输出与常见问题排查,系统讲解了从入门到精通的全流程操作与核心技巧,帮助用户高效完成材料物相鉴定与分析工作。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 一、 引言   迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator(); while(it.hasNext()){  //using “it.next();”do some businesss logic }   而这就是关于迭代器模式应用很好的例子。   二、 定义与结构   迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。   从定义可见,迭代器模式是为容器而生。很明显,对容器对象的访问必然涉及到遍历算法。你可以一股脑的将遍历方法塞到容器对象中去;或者根本不去提供什么遍历算法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。   然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。   而迭代器模式的出现,很好的解决了上面两种情况的弊端。先来看下迭代器模式的真面目吧。   迭代器模式由以下角色组成:   1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。   2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。   3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。   4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。   迭代器模式的类图如下: 从结构上可以看出,迭代器模式在客户与容器之间加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器内部细节的暴露,而且也使得设计符号“单一职责原则”。   注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代。   三、 举例   由于迭代器模式本身的规定比较松散,所以具体实现也就五花八门。我们在此仅举一例,根本不能将实现方式一一呈现。因此在举例前,我们先来列举下迭代器模式的实现方式。   1.迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java collection的应用中,是由客户程序来控制遍历的进程,被称为外部迭代器;还有一种实现方式便是由迭代器自身来控制迭代,被称为内部迭代器。外部迭代器要比内部迭代器灵活、强大,而且内部迭代器在java语言环境中,可用性很弱。   2.在迭代器模式中没有规定谁来实现遍历算法。好像理所当然的要在迭代器角色中实现。因为既便于一个容器上使用不同的遍历算法,也便于将一种遍历算法应用于不同的容器。但是这样就破坏掉了容器的封装——容器角色就要公开自己的私有属性,在java中便意味着向其他类公开了自己的私有属性。   那我们把它放到容器角色里来实现好了。这样迭代器角色就被架空为仅仅存放一个遍历当前位置的功能。但是遍历算法便和特定的容器紧紧绑在一起了。   而在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类。这样便保护了容器的封装。但是同时容器也提供了遍历算法接口,你可以扩展自己的迭代器。   好了,我们来看下Java Collection中的迭代器是怎么实现的吧。 //迭代器角色,仅仅定义了遍历接口 public interface Iterator {  boolean hasNext();  Object next();  void remove(); } //容器角色,这里以List为例。它也仅仅是一个接口,就不罗列出来了 //具体容器角色,便是实现了List接口的ArrayList等类。为了突出重点这里指罗列和迭代器相关的内容 //具体迭代器角色,它是以内部类的形式出来的。AbstractList是为了将各个具体容器角色的公共部分提取出来而存在的。 public abstract class AbstractList extends AbstractCollection implements List { …… //这个便是负责创建具体迭代器角色的工厂方法 public Iterator iterator() {  return new Itr(); } //作为内部类的具体迭代器角色 private class Itr implements Iterator {  int cursor = 0;  int lastRet = -1;  int expectedModCount = modCount;  public boolean hasNext() {   return cursor != size();  }  public Object next() {   checkForComodification();   try {    Object next = get(cursor);    lastRet = cursor ;    return next;   } catch(IndexOutOfBoundsException e) {    checkForComodification();    throw new NoSuchElementException();   }  }  public void remove() {   if (lastRet == -1)    throw new IllegalStateException();    checkForComodification();   try {    AbstractList.this.remove(lastRet);    if (lastRet < cursor)     cursor--;    lastRet = -1;    expectedModCount = modCount;   } catch(IndexOutOfBoundsException e) {    throw new ConcurrentModificationException();   }  }  final void checkForComodification() {   if (modCount != expectedModCount)    throw new ConcurrentModificationException();  } }   至于迭代器模式的使用。正如引言中所列那样,客户程序要先得到具体容器角色,然后再通过具体容器角色得到具体迭代器角色。这样便可以使用具体迭代器角色来遍历容器了……   四、 实现自己的迭代器   在实现自己的迭代器的时候,一般要操作的容器有支持的接口才可以。而且我们还要注意以下问题:   在迭代器遍历的过程中,通过该迭代器进行容器元素的增减操作是否安全呢?   在容器中存在复合对象的情况,迭代器怎样才能支持深层遍历和多种遍历呢?   以上两个问题对于不同结构的容器角色,各不相同,值得考虑。   五、 适用情况   由上面的讲述,我们可以看出迭代器模式给容器的应用带来以下好处:   1) 支持以不同的方式遍历一个容器角色。根据实现方式的不同,效果上会有差别。   2) 简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。   3) 对同一个容器对象,可以同时进行多个遍历。因为遍历状态是保存在每一个迭代器对象中的。   由此也能得出迭代器模式的适用范围:   1) 访问一个容器对象的内容而无需暴露它的内部表示。   2) 支持对容器对象的多种遍历。   3) 为遍历不同的容器结构提供一个统一的接口(多态迭代)。   六、 总结   迭代器模式在我们的应用中很广泛,希望本文能帮助你理解它。如有不对之处,还请不吝指正。
YOLOv12改进策略【Neck】| arXiv 2024 MAFPN:多分支辅助特征金字塔网络 | 通过双向辅助融合与异构卷积机制,解决传统PAFPN多尺度特征融合不充分与小目标检测不足问题 本文记录的是利用MAFPN颈部结构改进YOLOv12的目标检测网络模型。通过引入双向辅助融合机制优化特征处理流程,在自底向上路径利用 SAF 模块融合主干浅层特征与颈部输出,并保留浅层空间信息,为小目标检测提供更丰富细节;自顶向下路径通过 AAF 模块建立密集连接,聚合浅层高 / 低分辨率层、同级层及前层特征,均衡各层通道数后实现多向梯度信息交互,增强中 / 大目标特征表达。将其应用到中,解决传统特征金字塔在多尺度信息整合中的不足,提升多尺度目标检测的精度与特征表达的丰富性。Multi-Branch Aux 阅读详情

相关推荐

vivado:差分信号和单端信号 的相互转换 IBUFDS OBUFDS

FPGA能处理的都是单端信号,但有些输入信号是差分的,这时候就需要把差分信号转为单端信号。

qq_52137732的博客 1万+

迭代子模式 java_java迭代子模式详解

迭代子(Iterator)模式的结构:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。迭代子可分为外禀迭代子和内禀迭代子。外禀迭代子:适合于白箱聚集(白箱聚集就是向外界提供访问自己内部元素接口的聚集),由于迭代的逻辑是由聚集对象本身提供的,所以这样的外禀迭代子角色往往仅仅保持迭代的游标位置。所以具体迭代子角色是一个外部类,它的构造函数接受一个具体聚集对象,从而可以调用这个聚集对象的...

weixin_33728584的博客 220

Matlab Copula函数实战:从金融风控到数据建模的5个应用场景

本文深入探讨了Matlab Copula函数在金融风控与数据建模中的五大实战应用场景,包括投资组合风险价值计算、信用违约相关性建模、跨市场套利策略优化等。通过具体代码示例和数据分析,展示了Copula模型在捕捉复杂依赖关系方面的优势,为金融风险管理和量化分析提供实用工具。

weixin_29090677的博客 425

MMSegmentation 安装教程,避免mmcv不合适版本,及相关问题解决

都行,不做要求。

qq_43683133的博客 1220

Pytorch的一小步,昇腾芯片的一大步

相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片!

机器学习-深度学习-图像处理-opencv-段子 5241

Java设计模式之迭代器模式

一、 引言   迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();while(it.hasNext()){ //using “it.next();”do some businesss logic}

脱泥的技术日志 1141

gem5 run parsec2.1 ---- 亲测跑通教程

使用gem5模拟仿真parsec2.1,排除了各种bug,成功跑通,亲测有效!!!

m0_55539563的博客 1546

Java设计模式之迭代子模式

本文继续介绍23种设计模式系列之观察者模式。定义在软件构建过程中,集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为同一种算法在多种集合对象上进行操作提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。迭代子(Iterator)模式又叫游标

一个本科小生的奋斗史 1万+

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 779

从零实现深度学习框架——理解正则化(一)

本文介绍解决过拟合与欠拟合的方法——正则化,主要介绍L1和L2正则化。

日积月累,天道酬勤 3394

java8新特性[2]:内部迭代和外部迭代(Internal vs external iteration)

Java8 增加了新的语言特性(例如 lambda 表达式和默认方法),为此 Java8 的类库也进行了很多改进,例如从外部迭代到内部迭代的改变。 集合类库主要依赖于外部迭代(external iteration)。Collection 实现 Iterable 接口,从而使得用户可以依次遍历集合的元素。比如我们需要把一个集合中的形状都设置成红色,那么可以这么写: 1 2 ...

zly的博客 2826

在 NVIDIA DGX Spark 上运行 vLLM + Open WebUI

DGX Spark 和 GX10 都是性能强大的机器,但只有将它们视为交互式工作站而非精简版服务器,才能真正发挥它们的优势。合理利用共享资源,规划并发工作负载,并谨慎控制内存限制。做到这些,vLLM 与 Open WebUI 的结合就能成为可靠​​的日常工具,而不是脆弱的实验品。DGX平台本身价格不菲,但这并非体验此类硬件的唯一途径。多家厂商提供基于相同核心架构、价格更为亲民的系统,这些系统通常配备容量较小的固态硬盘或配置更为简化,但基本性能并未改变。

iCloudEnd的博客 1750

深入浅出Java设计模式之迭代器模式 (转)

原文地址:http://dev.yesky.com/474/2168474.shtml     一、 引言   迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();while(it.hasNext()){ //using “it.next();”do so...

s306587279的专栏 120

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java设计模式之 Iterator 迭代器模式

Java设计模式之 Iterator 迭代器模式 设计模式本身就是一门玄学,看不懂很正常,一次看懂就不是很正常了,多看多练才是关键 int [] array = {1 , 2 , 3 , 4 , 5 , 6}; for(int i = 0;i < array.length;i++) { System.out.println(array[i]); } 看这个代码是不是平平无奇,是的,它就是平平无奇的遍历和输出而已,其中变量 i 的作用就是确定当前对数组的索引,然后将这里的循环变量i的作用抽象化

qq_45108095的博客 262

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大聪明教你学Java设计模式 | 第十四篇:迭代器模式

大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案。大聪明本着“独乐乐不如众乐乐”的宗旨与大家分享一下设计模式的学习心得。

不肯过江东丶 417

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迭代器模式

1.深入浅出Java设计模式之迭代器模式 网地址:http://dev.yesky.com/474/2168474.shtml

世范水晶 122

深入浅出设计模式python_设计模式(2)- 深入浅出设计模式 阅读笔记

设计模式(2)- 深入浅出设计模式 阅读笔记命令模式命令模式就是不改变原有代码,而在原有代码的基础之上封装一层,为每个命令创建一个类,而这个类又实现了统一的一个接口。例如我们有电灯,电风扇,他们的开关方法分别叫 light, lights_out, on, off。用Python描述:class Light:def light(self):print("light on...")def light...

weixin_39627481的博客 206

深入浅出设计模式 - 迭代器模式

深入浅出设计模式 - 迭代器模式

激流丶的博客 2412

【迭代器模式】设计模式系列:从理论到实践的全面解析

本文全面解析了迭代器模式的核心概念及其在现代软件开发中的应用。从基础定义到高级主题如泛型、Lambda 表达式及 Stream API 的结合使用,再到最佳实践和案例研究,为读者提供了一套实用指南。探讨了迭代器模式在函数式编程、异步和并发编程中的重要性,并展望了其在未来技术趋势中的应用前景。对于希望提升代码质量和效率的开发者而言,本文是一份不可或缺的资源。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1475

深入浅出设计模式【十六、迭代器模式】

迭代器模式是一种行为设计模式,用于统一遍历不同集合对象的元素,而不暴露其内部结构。它通过将遍历逻辑封装在迭代器对象中,实现了以下核心价值: 解耦客户端与集合实现,客户端只需依赖迭代器接口 提供一致的遍历方式,支持多种数据结构的统一访问 遵循单一职责原则,分离集合存储与遍历职责 模式包含四个关键角色:迭代器接口、具体迭代器、聚合接口和具体聚合类。实现方式分为外部迭代器(客户端控制遍历)和内部迭代器(迭代器控制遍历),前者更灵活,后者更简洁。 典型应用场景包括:需要统一遍历不同数据结构、隐藏集合内部实现、支持多

NeoLshu的博客 1146

设计模式之迭代器模式

大家好,我是练习两年半的Java练习生,最近阅读了《深入浅出设计模式(中文版)》,学习了各种设计模式,所以想出一个专栏和大家分享一下!后续还会陆续更新!!提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。以上就是今天要讲的内容,本文介绍了设计模式中迭代器模式,主要作用就是遍历不同的集合对象,方便用户使用。

m0_52963553的博客 253
上一篇: 面向Java开发人员的Ajax:Java对象序列化
下一篇: java高级应用符合oo惯例的表现层控制
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值