设计模式详解-迭代器模式

news/2025/1/16 1:47:08/

类型:行为型模式

实现原理:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

作用:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示

解决的问题:不同的方式遍历整个整合对象的问题

何时使用:遍历一个聚合对象。

解决的方法:让迭代器访问元素,而不是聚合对象。

实现核心:定义接口:hasNext, next。

应用实例:文件系统遍历

优点: 1、支持以不同的方式遍历一个聚合对象。 2、简化聚合类。 3、在同一个聚合上可以有多个遍历。 4、增加新的聚合类和迭代器类方便

缺点:增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,系统的复杂性随之增加。

使用场景:1、需要不暴露内部信息地访问聚合对象的内容 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。

实现

步骤 1
创建接口:Iterator.java
public interface Iterator {public boolean hasNext();public Object next();
}
Container.java
public interface Container {public Iterator getIterator();
}
步骤 2
创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIteratorNameRepository.java
public class NameRepository implements Container {public String[] names = {"Robert" , "John" ,"Julie" , "Lora"};@Overridepublic Iterator getIterator() {return new NameIterator();}private class NameIterator implements Iterator {int index;@Overridepublic boolean hasNext() {if(index < names.length){return true;}return false;}@Overridepublic Object next() {if(this.hasNext()){return names[index++];}return null;}     }
}
步骤 3
使用 NameRepository 来获取迭代器,并打印名字。IteratorPatternDemo.java
public class IteratorPatternDemo {public static void main(String[] args) {NameRepository namesRepository = new NameRepository();for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){String name = (String)iter.next();System.out.println("Name : " + name);}  }
}
步骤 4
执行程序,输出结果:Name : Robert
Name : John
Name : Julie
Name : Lora
这段代码是一个简单的迭代器模式的示例。以下是对代码的解释:步骤1:定义接口Iterator 接口定义了迭代器的基本方法,包括 hasNext() 方法用于检查是否有下一个元素,以及 next() 方法用于获取下一个元素。Container 接口定义了获取迭代器的方法 getIterator()。步骤2:创建实体类NameRepository 是实现了 Container 接口的具体类。
NameRepository 内部定义了一个私有的内部类 NameIterator,它实现了 Iterator 接口,用于遍历 names 数组中的元素。
NameIterator 类中的 index 变量用于追踪当前迭代的位置。
hasNext() 方法检查是否还有下一个元素,如果 index 小于 names 数组的长度,则返回 truenext() 方法返回当前位置的元素,并将 index 递增。
步骤3:使用迭代器在 IteratorPatternDemo 类的主方法中,首先创建一个 NameRepository 对象 namesRepository。
然后通过调用 namesRepository 的 getIterator() 方法获取一个迭代器对象 iter。
最后使用 iter 迭代器进行循环遍历,通过调用 hasNext() 方法检查是否有下一个元素,然后调用 next() 方法获取下一个元素。
将获取的元素打印出来。
步骤4:输出结果执行程序后,将依次输出数组 names 中的每个元素。
这段代码演示了如何使用迭代器模式来遍历和获取集合中的元素,它提供了一种统一的方式来访问不同种类的集合或数据结构。

http://www.ppmy.cn/news/1047566.html

相关文章

树结构转List

使用LinkedList效率更高 1、单个顶级节点 public static List<CmsStudentOutline> getTreeList(CmsStudentOutline root) {List<CmsStudentOutline> list new ArrayList<>();Queue<CmsStudentOutline> queue new LinkedList<>();if (root nu…

深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)

谈到并发&#xff0c;我们不得不说AQS(AbstractQueuedSynchronizer)&#xff0c;所谓的AQS即是抽象的队列式的同步器&#xff0c;内部定义了很多锁相关的方法&#xff0c;我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。 …

javascript期末作业【三维房屋设计】 【文末源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景&#xff08;scene&#xff09; &#xff08;1&#xff09;创建场景对象 &#xff08;2&#xff09;设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…

Redis的数据持久化

前言 本文主要介绍Redis的三种持久化方式、AOF持久化策略等 什么是持久化 持久化是指将数据在内存中的状态保存到非易失性介质&#xff08;如硬盘、固态硬盘等&#xff09;上的过程。在计算机中&#xff0c;内存中的数据属于易失性数据&#xff0c;一旦断电或重启系统&#…

GSM/CDMA/VoLTE/VoIP通话

1.GSM(Global System for Mobile Communications) 本质是一种多址技术&#xff0c;将多个通话放入一段无线电频道的方法。特点是通过“时间划分”&#xff0c;称为时分多址。 2.CDMA(Code Division Multiple Access) 一种多址技术&#xff0c;将多个通话放入一段无线电频道的…

【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

阅读导航 前言stack1. stack概念2. stack特点3. stack使用 queue1. queue概念2. queue特点3. queue使用 容器适配器1. 什么是适配器2. STL标准库中stack和queue的底层结构3. STL标准库中对于stack和queue的模拟实现⭕stack的模拟实现⭕stack的模拟实现 总结温馨提示 前言 文章…

抖音火山引擎推出免费域名DNS和公共DNS服务

抖音旗下的云计算服务火山引擎最近推出了"TrafficRoute DNS 套件"服务&#xff0c;其中包括两款产品&#xff0c;对软希网来说非常有用。 1.域名DNS&#xff1a; 这是一个用于网站域名的DNS服务&#xff0c;可以加速域名解析速度&#xff0c;从而提升网站的速度。如…

【SoC基础】从[存储器]到[内存]再到[闪存],一次性解释清楚!

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…