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

介绍
根据GoF的定义,迭代器模式提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。这是一种行为设计模式。
顾名思义,迭代器有助于以定义的方式遍历对象集合,这对客户端应用程序很有用。在迭代期间,客户端程序可以根据需求对元素执行各种其他操作。
原理类图

迭代器模式的角色说明如下:
Iterator:访问或遍历元素集合的接口。提供具体迭代器必须实现的方法。ConcreteIterator:实现Iterator接口方法。它还可以跟踪聚合集合遍历中的当前位置。Aggregate:它通常是一个集合接口,它定义了一个可以创建迭代器对象的方法。ConcreteAggregate:它实现Aggregate接口,其特定方法返回- -ConcreteIterator的实例。
什么时候使用?
每种编程语言都支持一些数据结构,如列表或映射,用于存储一组相关对象。在Java中,我们有List、Map和Set接口及其实现,如ArrayList和HashMap。
只有当集合提供了访问其元素而不暴露其内部结构的方法时,它才有用。迭代器承担这一责任。
因此,无论何时,我们都有对象集合,并且客户端需要一种方法以适当的顺序迭代每个集合元素,我们必须使用迭代器模式来设计解决方案。
迭代器模式允许我们以如下方式设计集合迭代器:
- 我们能够访问集合的元素,而不暴露元素的内部结构或集合本身。
迭代器支持在向前、向后或两个方向上从开始到结束对集合进行多次同时遍历。
迭代器为透明地遍历不同的集合类型提供了统一的接口。
JDK中的实现
在Java中,我们有Java.util.Iterator接口及其特定的实现,例如ListIterator。所有Java集合都提供了Iterator接口的一些内部实现,该接口用于迭代集合元素。
List<String> names = Arrays.asList("alex", "brian", "charles");
Iterator<String> namesIterator = names.iterator();
while (namesIterator.hasNext())
{
String currentName = namesIterator.next();
System.out.println(currentName);
}
实战案例
在这个迭代器模式示例中,我们正在创建一个集合,该集合可以保存Topic类的实例,并将提供一个迭代器来按顺序迭代Topic集合。
public class Topic
{
private String name;
public Topic(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface Iterator<E>
{
void reset(); // reset to the first element
E next(); // To get the next element
E currentItem(); // To retrieve the current element
boolean hasNext(); // To check whether there is any next element or not.
}
public class TopicIterator implements Iterator<Topic> {
private Topic[] topics;
private int position;
public TopicIterator(Topic[] topics)
{
this.topics = topics;
position = 0;
}
@Override
public void reset() {
position = 0;
}
@Override
public Topic next() {
return topics[position++];
}
@Override
public Topic currentItem() {
return topics[position];
}
@Override
public boolean hasNext() {
if(position >= topics.length)
return false;
return true;
}
}
public interface List<E>
{
Iterator<E> iterator();
}
public class TopicList implements List<Topic>
{
private Topic[] topics;
public TopicList(Topic[] topics)
{
this.topics = topics;
}
@Override
public Iterator<Topic> iterator() {
return new TopicIterator(topics);
}
}
public class Main
{
public static void main(String[] args)
{
Topic[] topics = new Topic[5];
topics[0] = new Topic("topic1");
topics[1] = new Topic("topic2");
topics[2] = new Topic("topic3");
topics[3] = new Topic("topic4");
topics[4] = new Topic("topic5");
List<Topic> list = new TopicList(topics);
Iterator<Topic> iterator = list.iterator();
while(iterator.hasNext()) {
Topic currentTopic = iterator.next();
System.out.println(currentTopic.getName());
}
}
}
- 程序输出:

Java设计模式-迭代器模式Iterator的更多相关文章
- JAVA 设计模式 迭代器模式
用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构
- java设计模式——迭代器模式
一. 定义与类型 定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示 类型:行为型. 二. 使用场景 (1) 访问一个集合对象的内容而无需暴露它的内部表示 (2) 为遍 ...
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- javascript设计模式-迭代器模式(Iterator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 设计模式 -- 迭代器模式(Iterator)
--------------------------------------------------------------------- 1.场景问题 考虑这样一个问题: 9个学生对象分别通过数组存 ...
- Java设计模式の迭代器模式
迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...
- C#设计模式——迭代器模式(Iterator Pattern)
一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...
- JAVA设计模式---迭代器模式
1.定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 2.实例:1)需求: 菜单(煎饼屋菜单.餐厅菜单和咖啡菜单)采用不同的集合存取(ArrayList,String[] ...
- java设计模式----迭代器模式和组合模式
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 设计原则: 单一责任:一个类应该只有一个引起变化的原因 组合模式: 允许你将对象组合成树形结构来表现“整体/部分” ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
随机推荐
- mysql-三元表达式函数-if
- [转帖]Django10——从db.sqlite3迁移到MySQL
https://blog.csdn.net/weixin_47197906/article/details/124889477 文章目录 1.查看Django支持的数据库 2.修改数据库配置 1.查看 ...
- [转帖]GRUB2 配置文件详解
https://www.cnblogs.com/fluidog/p/15176726.html 1. GRUB2配置文件 GRUB2 的配置文件通常为 /boot/grub2/grub.cfg,虽然此 ...
- OpenGauss 单机版安装
OpenGauss 单机版安装 银河麒麟的前置事项 yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch rea ...
- [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具
https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...
- [转帖]细说Redis监控和告警
https://blog.csdn.net/sD7O95O/article/details/78096956 对于任何应用服务和组件,都需要一套完善可靠谱监控方案.尤其redis这类敏感的纯内存.高并 ...
- Oracle 高版本导出到低版本的测试验证
今天验证Oracle 由高版本 备份恢复到低版本 与方神沟通(双 还是他) 说可以使用 version的参数..然后搞一下.. expdp system/Test6530@ora12cr2 schem ...
- vue3.2中setup语法糖父组件如何调用子组件中的方法
父组件如何调用子组件中的方法 父组件.vue <template> <div> <aa ref="testRef"></aa> &l ...
- 洛谷P3101 题解
输入格式 第 \(1\) 行,三个整数 \(m,n,t\). 第 \(2\) 到 \(m+1\) 行,\(m\) 个整数,表示海拔高度. 第 \(2+m\) 到 \(2m+1\) 行,\(m\) 个整 ...
- C/C++ 反汇编:针对加减乘除的还原
算术运算通常是指,加减乘除四则运算,而计算机中的四则运算与数学中的有所不同,同样是实现算术运算,高级语言与汇编语言的实现思路完全不同,往往一个简单的减法运算,都要几条指令的配合才能得出计算结果,而为了 ...