设计模式——迭代器

C++设计模式 - 迭代器模式 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录设计模式概念迭代器模式简介迭代器模式代码示例 设计模式概念 设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取: 代码更易于维护,代码的可读性,复用性,可移植性,健壮性会... 阅读详情

ITERATOR 迭代

 

1、 意图

提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。

2、别名

游标

3、关键思想

迭代器模式的关键思想就是将列表的访问和遍历从列表对象中分离出来并放入一个迭代器(iterator)对象中。迭代器类定义了一个访问该列表的接口。迭代器对象负责跟踪当前的元素:即,它知道哪些元素已经遍历过了。

4、 适用性

迭代器模式可用来:

●访问一个聚合对象的内容而无需暴露它的内部表示。

●支持对聚合对象的多种遍历

●为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

5、 结构

 

6、 参与者

●Iterator(迭代器);迭代器定义访问和遍历元素的接口。

●ConcreteIterator(具体迭代器);

            ——具体迭代器实现迭代器接口。

            ——对该聚合遍历时跟踪当前位置。

●Aggregate(聚合)

            ——聚合定义创建相应迭代器对象的接口。

●ConcreteAggregate(具体聚合)

            ——具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。

7、 协作

ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象。

8、 效果

迭代器模式有三个重要的作用:

1)它支持以不同的方式遍历一个聚合;复杂的聚合可用多种方式进行遍历。迭代器模式使得改变遍历算法变得很容易:仅需用一个不同的迭代器的实例代替原先的实例即可。也可以自己定义迭代器的子类以支持新的遍历。

2)迭代器简化了聚合的接口;有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了。这样就简化了聚合的接口。

3)在同一个聚合上可以有多个遍历;每个迭代器保持它自己的遍历状态。因此你可以同时进行多个遍历。

9、 实现

迭代器在实现上有许多变化和选择。下面是一些比较重要的实现。实现迭代器模式时常常需要根据所使用的语言提供的控制结构来进行权衡。

1)谁控制该迭代;一个基本的问题是决定由哪一放来控制该迭代器,是迭代器还是使用该迭代器的客户。当由客户来控制迭代时,该迭代器称为一个外部迭代器,而当由迭代器控制迭代时,该迭代器称为一个内部迭代器。使用外部迭代器的客户必须主动推进遍历的步伐,显式地向迭代器请求下一个元素。使用内部迭代器客户只需向其提交一个待执行的操作,而迭代器将聚合中的每一个元素实施该操作。外部迭代器闭内部迭代器更灵活。

2)谁定义遍历算法;迭代器不是唯一可定义遍历算法的地方。聚合本身也可以定义遍历算法,并在遍历工程中用迭代器来存储当前跌倒的状态。我们称这种迭代器为一个游标(cursor),因为它仅用来指示当前位置。客户会以这个游标为一个参数调用该聚合的Next操作,而Next操作将改变这个指示器的状态。如果迭代器负责遍历算法,那么将易于在相同的聚合上使用不同的迭代算法,同时也易于在不同的聚合上重用相同的算法。从另一方面,遍历算法可能需要访问聚合的私有变量。

3)迭代器健壮程度;在遍历一个聚合的时候同时更改这个聚合可能是危险的。如果在遍历聚合的时候添加或删除该聚合元素,可能会导致两次访问同一个元素或者遗漏掉某个元素。一个简单的解决方法是拷贝该聚合,并对该拷贝实施遍历,但一般来说这样做代价太高。一个健壮的迭代器保证插入和删除操作不会收干扰遍历,且不需要拷贝该聚合。有许多方法来实现健壮的迭代器。其中大多数需要向这个聚合注册该迭代器。当插入或删除元素时,该聚合要么调整迭代器的内部状态,要么在内部的维护额外的信息以保证正确的遍历。

4)附加的迭代器操作;迭代器的最小接口由First、Next、IsDone和CurrentItem操作组成。其他一些操作可能也很有用。

5)多态的迭代器。

6)迭代器可有特权访问;迭代器可被看作为创建它的聚合的一个扩展。迭代器和聚合紧密耦合。

7)用于复合对象的迭代器;在Composite模式中的那些递归聚合结构上,外部迭代器可能难以实现,因此在该结构中不同对象处于嵌套聚合的多个不同层次,因此一个外包迭代器为跟踪当前的对象必须存储一条纵贯该Composite的路径。有时使用一个内部迭代器会更容易一些。它仅需递归地调用自己即可,这样就隐式地将路径存储在调用栈中,而无需显式地维护当前对象位置。如果复合中的节点有一个接口可以从一个节点移到它的兄弟节点、父节点和子节点,那么基于游标的迭代器是个更好的选择。游标只需跟踪当前的节点;它可依赖这种节点接口来遍历该复合对象。

8)空迭代器;一个空迭代器(NullIterator)是一个退化的迭代器,它有助于处理边界条件。根据定义,一个NullIterator总是已经完成了遍历:即他的IsDone操作总是返回true。空迭代器使得更容易遍历树形结构的聚合。在遍历过程中的每一个节点,都可向当前的元素请求遍历其各个子结点的迭代器。该聚合元素将返回一个具体的迭代器。但叶节点元素返回NullIterator的一个实例。这就使我们可以用一种统一的方式实现整个结构上的遍历。

10、代码示例

Aggregate

package com.examples.pattern.iterator;

/**   
*  聚合对象的接口,定义创建相应迭代器对象的接口  
*/
public abstract class Aggregate {
	
	/**
	 * 工厂方法,创建相应迭代器对象的接口
	 * @return	相应迭代器对象的接口
	 */
	public abstract Iterator createIterator();

}
ConcreteAggregate
package com.examples.pattern.iterator;

/**   
*  具体的聚合对象,实现创建相应迭代器对象的功能  
*/
public class ConcreteAggregate extends Aggregate {
	
	private String[] ss = null;
	
	public ConcreteAggregate(String[] ss){
		this.ss = ss;
	}

	@Override
	public Iterator createIterator() {
		return new ConcreteIterator(this);
	}
	
	public Object get(int index){
		Object retObj = null;
		if(index < ss.length){
			retObj = ss[index];
		}
		return retObj;
	}
	
	public int size(){
		return this.ss.length;
	}

}
Iterator
package com.examples.pattern.iterator;

/**
 * 迭代器接口,定义访问和遍历元素的操作
 */
public interface Iterator {

	/**
	 * 移动到聚合对象的第一个位置
	 */
	public void first();

	/**
	 * 移动到聚合对象的下一个位置
	 */
	public void next();

	/**
	 * 判断是否已经移动到聚合对象的最后一个位置
	 * 
	 * @return true表示已经移到聚合对象的最后一个位置 false表示还没有移动到聚合对象的最后一个位置
	 */
	public boolean isDone();

	/**
	 * 获取迭代的当前元素
	 * @return	迭代的当前元素
	 */
	public Object currentItem();

}
ConcreteIterator
package com.examples.pattern.iterator;

/**
 * 具体的迭代器实现对象,示意的是聚合对象为数组的迭代器 不同的聚合对象相应的迭代器实现是不一样的
 */
public class ConcreteIterator implements Iterator {

	/**
	 * 持有被迭代器的具体的聚合对象
	 */
	private ConcreteAggregate aggregate;

	/**
	 * 内部索引,记录当前迭代到的索引位置 -1表示刚开始的时候,迭代器指向聚合对象第一个对象之前
	 */
	private int index = -1;

	/**
	 * 构造方法,传入被迭代的具体的聚合对象
	 * 
	 * @param aggregate
	 */
	public ConcreteIterator(ConcreteAggregate aggregate) {
		this.aggregate = aggregate;
	}

	@Override
	public Object currentItem() {
		return this.aggregate.get(index);
	}

	@Override
	public void first() {
		index = 0;
	}

	@Override
	public boolean isDone() {
		if (index == this.aggregate.size()) {
			return true;
		}
		return false;
	}

	@Override
	public void next() {
		if (index < this.aggregate.size()) {
			index = index + 1;
		}
	}

}
Client
package com.examples.pattern.iterator;

public class Client {
	
	public  void someOperation() {
		String[] names = {"张三","李四","王五"};
		//创建聚合对象
		Aggregate aggregate = new ConcreteAggregate(names);
		//循环输出聚合对象中的值
		Iterator it = aggregate.createIterator();
		//首先设置迭代器到第一个元素
		it.first();
		while(!it.isDone()){
			//取出当前元素
			Object obj = it.currentItem();
			System.out.println("this obj == " +obj);
			//如果还没有迭代到最后,那么就向下迭代一个
			it.next();
		}
	}
	
	public static void main(String[] args) {
		Client client = new Client();
		client.someOperation();
	}

}





23中设计模式-迭代器(Iterator)设计模式 软考中级-软件设计师 迭代器模式 阅读详情

相关推荐

io_uring vs epoll ,谁在网络编程领域更胜一筹?

简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异。 本文作者:王小光,「高性能存储技术SIG」核心成员。 背景 io_uring 在传统存储 io 场景已经证明其价值,但 io_uring 不仅支持传统存储 io,也支持网络 io。io_uring 社区有众多的开发者尝试将 io_uring 用于网络应用。我们之前也在《你认为 io_uring 只适用于存储 IO?大错特错!》中也探索过 io_uring 在网络场景的应用及其

阿里云云栖号 3034

设计模式C++实现18:迭代器模式(Iterator)

设计模式C++实现18:迭代器模式(Iterator)

863

手把手教你解锁TI MSPM0G3507开发板(2025新版,附XDS110接线图)

本文详细解析了2025版TI MSPM0G3507开发板的解锁方法,针对新版硬件中BSL引脚的电路设计变化提供了精准接线方案和UniFlash软件配置步骤。通过实测数据和专业指导,帮助开发者解决芯片锁定问题,确保调试接口正常响应。

weixin_42696271的博客 807

数据结构(c++)学习笔记--栈与队列

数据结构学习笔记的一部分,主要用于个人记忆和复习,在代码和编辑习惯上也倾向于本人特点,主要专注于能读性和简便性。

VaIOReTto1的博客 502

SillyTavern与Claude Code API集成:从零搭建AI聊天酒馆的完整指南

本文提供了一份从零搭建SillyTavern AI聊天前端的完整指南,重点讲解如何将其与Claude Code API集成。内容涵盖Node.js环境准备、SillyTavern部署、OpenAI兼容格式的API配置、模型选择与参数调校,以及角色扮演、扩展功能等高级玩法,帮助用户打造本地化、可定制的专属AI聊天体验。

assembly8low的博客 2606

opencode完整使用指南:从安装配置到Agent式编程实战

AI编程工具正从辅助补全向智能体协作演进。编程智能体不仅理解项目全局,还能自主执行原子级重构、测试验证等工程任务,显著提升研发效能。以opencode为代表的开源终端AI编程工具,凭本地优先和灵活模型接入成为技术团队新宠。本文围绕opencode的完整使用链路展开,从Node.js环境准备、npm全局安装,到解决Windows环境变量配置问题,再到接入OpenAI、Anthropic或多模型管理平台,梳理一套标准化接入方案。同时演示VSCode插件调用、LSP语义分析及Playwright驱动的浏览器自动化

weixin_28837817的博客 319

java设计模式之迭代器模式

迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(), (2)具体迭代器角色(Concrete Iter...

weixin_44177758的博客 324

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2565

Java 基础 -- Map集合

java 基础 – Map集合 前言 Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样。 Map 接口主要有两个实现类:HashMap 类和 TreeMap 类。其中,HashMap 类按哈希算法来存取键对象,而 TreeMap ...

寿春 296

基于Simulink的电源纹波抑制仿真

电源纹波(Power Supply Ripple)是指直流电源输出中存在的交流分量。纹波的存在会导致电压波动,进而影响负载设备的性能和寿命。为了确保高质量的电源输出,通常需要设计有效的滤波电路来抑制纹波。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电源纹波抑制方案。本教程将详细介绍如何使用 Simulink 进行电源纹波抑制的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行电源纹波抑制的仿真实例。背景介绍:理解电源纹波及其对电力电子系统的影响。仿真建模过程。

xiaoheshang_123的博客 513

Dify框架面试内容整理-如何进行Dify的二次开发?

无论是轻量修改界面,还是深度集成自定义模型、Agent、知识库,你都可以很方便地进行二次开发。,你可以基于它的开源架构对功能进行扩展、集成第三方服务、修改界面风格,甚至定制新的AI工作流程。前端:Node.js >= 16,React + TypeScript + Tailwind。接入自己的模型API(如:调用LLaMA、Baichuan、ChatGLM)。修改路径:/api/app/services/providers/可接入你自己的向量数据库(Qdrant、Milvus、FAISS)

不务正业的猿 2002

迭代模式 java_JAVA设计模式之迭代器设计模式

一、迭代器模式简介Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。二、迭代器模式的角色与职责Iterator(迭代器接口):该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。ConcreteIterator(迭代器实现类):迭代器接口Iterator的实现...

weixin_39572152的博客 139

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式之迭代器

(Iterator) 是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。如果对C++中STL比较了解的话,学习此设计模式很容易。适用场景代码如下:问题:两个餐厅要合并,虽然两家菜单系统类似,但底层使用的数据结构不同,如何实现一个通用的菜单遍历器?解决方案:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。

qq_74811378的博客 1358

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

行为设计模式:迭代器设计模式

假设我们想要开发一个新的数据结构,它是一个集合,然后我们可以使用迭代器模式。如果有人想要使用数据结构,他们可以简单地使用您描述的迭代器,而不必在他们的代码中创建唯一的迭代器。即使你从未遇到过这些问题,识别模式也很有价值,因为它教会了你如何使用面向对象的设计概念来解决大量的问题。它是最后一个必需的参与者,负责 Aggregate 接口的实现。众所周知,迭代器是一种行为设计模式,它允许您遍历集合的组件,而无需显示下面的表示。当你的集合有一个复杂的数据结构,你希望对客户端隐藏,那么我们使用迭代器模式的概念。

新华编程特战队 2052

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Design Pattern Iterator 迭代器设计模式

这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用iterator的,C++和Java都是。 所以感觉没什么特别的,就是需要模仿C++或者Java的iterator类的功能吧。 这里简单写个,使用C++模仿Java的iterator一些功能,呵呵。 首先我们有一个集合类,而这个集合类包含了其他类,当我们需要遍历这个集合类包含的类的时候,就好使用iterator功能了。 比如有一

靖空间 1307

迭代器设计模式(Iterator Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

迭代器设计模式(Iterator Design Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象(如集合)的元素,而不需要暴露该对象的底层表示。迭代器模式可以帮助我们在不关心底层数据结构的情况下,遍历一个集合。

龙飞的博客 844

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

抽象迭代器角色(Iterator):负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移除当前对象的方法remove()具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,例如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList,Set接口的哈希列表的实现HashSet等。代码示例,自定义集合容器简化版。

2302_76363587的博客 868

设计模式之迭代器模式

迭代器模式为遍历集合中的元素提供了一种通用接口。其核心思想是,将集合的遍历逻辑与集合对象的实现分离。通过迭代器,客户端代码无需关心集合的底层实现方式(如数组、链表等),就能顺序地访问集合的每一个元素。迭代器设计模式提供了在不暴露对象内部结构的情况下,顺序访问对象集合的有效方法。通过分离集合的实现和遍历逻辑,迭代器模式不仅提高了代码的灵活性,还增强了代码的可维护性。在 Java 集合框架中,迭代器模式有着广泛的应用场景,它极大简化了集合的遍历操作,降低了代码复杂性。

道可道非常道 1219

迭代器设计模式

迭代器设计模式(Iterator)是一种结构型设计模式。该模式提供一种方法顺序访问一个聚合对象(如:JDK中的容器对象ArrayList等)中各个元素,而又不暴露该对象的内部表示。

Keiissland的博客 695

行为设计模式 - 迭代器设计模式

行为设计模式 -迭代器设计模式 迭代器设计模式中的一种行为模式。迭代器模式用于提供遍历一组对象的标准方法。Iterator模式广泛用于Java Collection Framework。Iterator接口提供遍历集合的方法。 目录[隐藏] 1迭代器设计模式 1.1迭代器模式示例 1.2迭代器设计模式重点 1.3JDK中的迭代器设计模式 ...

YunWisdom 616

迭代器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 ! 目录 1.简介 2.什么是迭代器设计模式 3.实施迭代器设计模式 4.内部和外部迭代器 4.1。 内部迭代器 4.2。 外部迭代器...

最佳 Java 编程 131

【设计模式】Java设计模式 - 迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。

qq_43843951的博客 657

19【迭代器设计模式】

迭代器设计模式(Iterator Pattern):它提供一种按顺序访问容器中对象的元素,而又无须暴露该容器的内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内部元素的组成结构;迭代器模式的核心是把容器中的元素的迭代抽离到迭代器中,提供一致访问的接口;1)访问一个容器对象的内容而无须暴露他的内部表示2)为遍历不同的容器结构提供一个统一的访问(迭代)接口。

緑水長流*z 1065
上一篇: 设计模式——命令模式
下一篇: Eclipse加载全部的Ext卡死解决方法
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值