重学设计模式-Iterator(迭代器模式)

Iterator迭代器模式

介绍:

迭代器模式是一种行为型设计模式,它允许你在不暴露集合底层表示(并不知道集合底层使用何种方式对数据尽心存储)的情况下遍历集合中的元素。

  • 这种模式提供了一种方法,可以顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
  • 迭代器模式通常包括两个角色:迭代器和聚合对象。
    • 迭代器(Iterator,读取元素
      • 负责定义访问和遍历元素的接口
      • 实现了该接口的类,拥有访问聚合对象中元素的能力
    • 聚合对象(Aggregate,存储元素
      • 负责定义创建相应迭代器对象的接口,该接口返回一个适当的迭代器实例
      • 实现了该接口的类将成为一个可以保存多个元素的集合,就像数组一样

以下是一个简单的迭代器实例,演示了如何使用迭代器模式遍历一个集合:

1、抽象实例

创建迭代器接口:

/*** 迭代器接口** @author supanpan* @date 2023/12/21*/
public interface Iterator<T>{/*** 判断是否存在下一个元素* @return: 循环终止条件*  true:集合中存在下一个元素*  false:集合中不存在下一个元素*/boolean hasNext();/*** 获取下一个元素,并且将迭代器指针位置移动到下一个元素*/T next();
}

实现迭代器接口,具体迭代器实现:

/*** 具体迭代器实现** @author supanpan* @date 2023/12/21*/
public class ConcreteIterator<T> implements Iterator<T> {private List<T> list;// 存放元素的列表private int position;// 遍历元素的下标/*** 初始化迭代器**/public ConcreteIterator(List<T> list) {this.list = list;this.position = 0;}/*** 判断是否到集合的末尾**/@Overridepublic boolean hasNext() {return position < list.size();}/*** 遍历(迭代)集合取出相应元素**/@Overridepublic T next() {if (!hasNext()){throw new NoSuchElementException("没有元素了......");}T item = list.get(position);position++;return item;}
}

创建聚合对象:

/*** 聚合对象** @author supanpan* @date 2023/12/21*/
public interface Aggregate<T> {/*** 生成一个用于遍历集合的迭代器**/Iterator<T> createIterator();
}

实现聚合对象接口,创建具体聚合对象:

/*** 具体聚合对象** @author supanpan* @date 2023/12/21*/
public class ConcreteAggregate<T> implements Aggregate<T>{private List<T> items;public ConcreteAggregate() {this.items = new ArrayList<>();}/*** 向集合中添加元素* @param item 待添加元素*/public void addItem(T item){items.add(item);}/*** 创建迭代器对象** @return 具体的迭代器*/@Overridepublic Iterator<T> createIterator() {
//         items.sort(null);// 在创建迭代器之前对集合中的元素进行排序操作return new ConcreteIterator<>(items);// 将聚合对象中的集合传递给具体迭代器对象,以供访问}
}

测试Main:

public class Main {public static void main(String[] args) {// 创建聚合对象ConcreteAggregate<String> aggregate = new ConcreteAggregate<>();// 向聚合对象中添加元素aggregate.addItem("Item 1");aggregate.addItem("Item 3");aggregate.addItem("Item 2");aggregate.addItem("Item 4");// 获取迭代器对象Iterator<String> iterator = aggregate.createIterator();// 使用迭代器模式进行遍历while (iterator.hasNext()){// 获取迭代器中的元素String item = iterator.next();System.out.println(item);}}
}

2、书架实例

创建聚合对象,用于将具体实现类中的集合通过迭代器进行返回

public interface Aggregate<T> {Iterator<T> iterator();
}

创建迭代器对象,用于访问聚合对象中的数组数据

public interface Iterator<T> {boolean hasNext();T next();
}

创建Book对象,Book对象用于获取书籍的名称

public class Book {private String name;// 书籍名称public Book(String name) {this.name = name;}public String getName() {return name;}
}

创建BookShelf对象,这个对象实现了Aggregate接口,拥有聚合元素的能力

public class BookShelf implements Aggregate{private ArrayList<Book> books;// 对比抽象实例中的数组,这里改成了存放书籍的列表/*** 初始化集合对象** @param initialSize 集合大小*/public BookShelf(int initialSize){this.books = new ArrayList<>(initialSize);}public Book getBookAt(int index) {return (Book) books.get(index);}public void appendBook(Book book) {books.add(book);}public int getLength() {return books.size();}/*** 将书籍数组返回给具体迭代器实现类,提供访问书籍数组的能力* */public Iterator iterator() {return new BookShelfIterator(this);}
}

创建BookShelfIterator对象,这个对象实现了Iterator接口,拥有访问聚合对象中的数据能力

public class BookShelfIterator implements Iterator{private BookShelf bookShelf;private int index;/*** 初始化迭代器* @param bookShelf 聚合对象集合数据*/public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;this.index = 0;}@Overridepublic boolean hasNext() {return index < bookShelf.getLength();}@Overridepublic Object next() {Book item = bookShelf.getBookAt(index);index++;return item;}
}

测试类:

public class Main {public static void main(String[] args) {BookShelf bookShelf = new BookShelf(4);bookShelf.appendBook(new Book("时间简史"));bookShelf.appendBook(new Book("活着"));bookShelf.appendBook(new Book("百年孤独"));bookShelf.appendBook(new Book("1984"));bookShelf.appendBook(new Book("三体"));bookShelf.appendBook(new Book("围城"));bookShelf.appendBook(new Book("小王子"));bookShelf.appendBook(new Book("云边的小卖部"));Iterator it = bookShelf.iterator();while (it.hasNext()) {Book book = (Book)it.next();System.out.println(book.getName());}}
}

3、Iterator总结

通过以上两个实例,在每个实例中,都出现了相对重要的接口和实现类,这四个关键角色,分别是Iterator(迭代器)、ConcreteIterator(具体的迭代器)、Aggregate(聚合对象)和ConcreteAggregate(具体的聚合对象)。

  1. Iterator(迭代器)
  • Iterator是一个接口,它定义了在集合对象上进行迭代的方法
    • hasNext()用于检查是否还有下一个元素
    • next()用于获取下一个元素。
  1. ConcreteIterator(具体的迭代器)
  • ConcreteIterator是Iterator接口的具体实现,它持有对应的集合对象,并且在内部实现了迭代逻辑。
  • 具体的迭代器类通常会包含一个指向当前元素的游标,并且实现了Iterator接口中定义的方法。
  1. Aggregate(聚合对象)
  • Aggregate是一个接口,它定义了创建迭代器对象的方法,例如createIterator()
  • 聚合对象是包含一组元素的对象,它通常会提供一种方式来获取迭代器对象,使得外部客户端可以通过迭代器遍历聚合对象中的元素。
  1. ConcreteAggregate(具体的聚合对象)
  • ConcreteAggregate是Aggregate接口的具体实现,它实现了创建迭代器对象的方法,并且通常会包含一个内部集合来存储元素。
  • 具体的聚合对象类会将迭代器对象的创建委托给具体的迭代器类。

下面是Iterator实现的类图:

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

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

相关文章

java类和对象的思想概述

0.面向对象Object OOP——名人名言&#xff1a;类是写出来的&#xff0c;对象是new出来的 **> 学习面向对象的三条路线 java类以及类成员&#xff1a;&#xff08;重点&#xff09;类成员——属性、方法、构造器、&#xff08;熟悉&#xff09;代码块、内部类面向对象特征&…

文章解读与仿真程序复现思路——高电压技术EI\CSCD\北大核心《含CCUS和P2G的综合能源系统分布式鲁棒优化调度》

这个标题涉及到两个关键的能源技术领域&#xff0c;即CCUS&#xff08;Carbon Capture, Utilization, and Storage&#xff0c;碳捕捉利用与储存&#xff09;和P2G&#xff08;Power-to-Gas&#xff0c;电力转化为气体&#xff09;。同时&#xff0c;它提到了综合能源系统的分布…

Linux中文件权限

目录 一、文件类型 二、三字符的码&#xff0c;三重访问权限 三、chmod改变权限 3.1 八进制模式 3.2 符号模式 文件无权限&#xff0c;无法操作&#xff0c;有没有感觉很恼火呀&#xff1f; 下面来分析一下linux中的文件权限。 一、文件类型 - 代表文件 d 代表目录 l 代表…

EarMaster Pro 7 简体中文破解版 v7.2.0.42 电脑版

软件介绍 EarMaster破解版一款功能强大的专业级别多媒体音乐教育学习软件&#xff0c;EarMaster破解版提供了大量音乐相关的学习内容&#xff0c;用户在这里可以学习基础的和弦、音阶、节奏&#xff0c;也可以提升自己的音感&#xff0c;如果基础已经很扎实了&#xff0c;还可…

【ONE·MySQL || 基础介绍】

总言 主要内容&#xff1a;MySQL在Centos 7下的安装&#xff08;主要学习相关指令语句&#xff0c;理解安装操作是在做什么&#xff09;、对MySQL数据库有一个基础认识。 文章目录 总言0、MySQL的安装与卸载&#xff08;Centos 7&#xff09;0.1、MySQL的卸载0.1.1、卸载不必要…

FCIS 2023网络安全创新大会-核心PPT资料下载

一、峰会简介 本次会议的主题是“AI大模型、人工智能与智能制造安全、攻击面管理与供应链安全”。 1、AI大模型 会议首先探讨了AI大模型在网络安全领域的应用。AI大模型是一种基于深度学习的模型&#xff0c;具有强大的特征提取和分类能力&#xff0c;可以用于检测和防御各种…

Springboot+vue的装饰工程管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的装饰工程管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的装饰工程管理系统&#xff0c;采用M&#xff08…

RateLimiter速率了解

RateLimiter <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version> </dependency>这个同名的类在nacos的jar包中也有出现。速率限制于java.util.concurrent.Semaphore功能…

【2023年网络安全优秀创新成果大赛专刊】银行数据安全解决方案(天空卫士)

在2023年网络安全优秀创新成果大赛&#xff0c;成都分站中&#xff0c;天空卫士银行数据安全方案获得优秀解决方案奖。与此同时&#xff0c;天空卫士受信息安全杂志邀请&#xff0c;编写《银行数据安全解决方案》。12月6日&#xff0c;天空卫士编写的《银行数据安全解决方案》做…

Python命令行参数解析:原理、技巧与实践

文章目录 引言命令行参数解析原理命令行参数概述使用argparse模块解析命令行参数1. 创建ArgumentParser对象2. 添加命令行参数3. 解析命令行参数4. 可选参数action5. 参数的类型转换 实践示例总结结束语 引言 在Python中&#xff0c;命令行参数解析是一个重要的主题&#xff0…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…

【原理图专题】如何使用OrCAD Capture鱼眼视图

在原理图设计时,有时一张图纸下有很多的电路。但是我们查看时只关注一部分,是不是要使用放大功能直接进行放大呢? 其实还可以使用鱼眼视图功能来相应的查看。 如下所示为原始视图:可以看到一些器件名称、网络标号等已经看不清了。如果正常我们要查看部分视图,这时通用的…