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

news2025/7/13 4:22:16

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;
  }

  /**
   * 判断是否到集合的末尾
   *
   */
  @Override
  public boolean hasNext() {
    return position < list.size();
  }

  /**
   * 遍历(迭代)集合取出相应元素
   *
   */
  @Override
  public 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 具体的迭代器
     */
    @Override
    public 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;
  }

  @Override
  public boolean hasNext() {
    return index < bookShelf.getLength();
  }

  @Override
  public 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.coloradmin.cn/o/1328183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit 二次开发 获取构件的某一层材质

如获取墙的结构材质&#xff1a;混凝土-现场浇筑混凝土 //拿到墙材质 WallType wallType (walls[i] as Wall).WallType; CompoundStructure wallCS wallType.GetCompoundStructure(); CompoundStructureLayer wallLayer wallCS.GetLayers().Where(r > r.Function Materi…

华为科技:辉煌发展、问题应对与未来战略

导言 作为全球领先的科技公司之一&#xff0c;华为经历了辉煌的发展历程。本文将深入探讨华为科技的发展过程、遇到的问题及解决过程、未来的可用范围&#xff0c;以及在各国的应用和未来的研究趋势。同时&#xff0c;分析在哪些领域华为能够取胜&#xff0c;以及在哪些方面发力…

IntelliJ IDEA 2023.3 新功能介绍

IntelliJ IDEA 2023.3 在众多领域进行了全面的改进&#xff0c;引入了许多令人期待的功能和增强体验。以下是该版本的一些关键亮点&#xff1a; IntelliJ IDEA mac版下载 macappbox.com/a/intellij-idea-for-mac.html 1. AI Assistant 的全面推出 IntelliJ IDEA 2023.3 中&am…

FPGA——XILINX原语(1)

FPGA——XILINX原语&#xff08;1&#xff09; 1.时钟组件&#xff08;1&#xff09;BUFG&#xff08;2&#xff09;BUFH&#xff08;3&#xff09;BUFR&#xff08;4&#xff09;BUFIO&#xff08;5&#xff09;使用场景 2.IO端口组件&#xff08;1&#xff09;IDDR&#xff0…

2. 创建型模式 - 抽象工厂模式

亦称&#xff1a; Abstract Factory 意图 抽象工厂模式是一种创建型设计模式&#xff0c; 它能创建一系列相关的对象&#xff0c; 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类&#xff0c; 用于表示&#xff1a; 一系列相关产品&…

竞赛保研 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

【自学笔记】Python测试框架pytest

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 安装📝 编写测试函数⚓️ 相关链接 ⚓️📖 介绍 📖 pytest 是一个广泛使用的 Python 测试框架,它提供了简单、灵活和可扩展的测试功能。通过 pytest,您可以轻松地创建和运行单元测试、集成测试和功能测试…

专业数据中台哪个好?亿发数字化运营平台解决方案,助力大中型企业腾飞

数据中台的核心在于避免数据的重复计算&#xff0c;通过数据服务化的方式提升数据的共享能力&#xff0c;为数据应用赋能。 在信息技术时代&#xff0c;企业的信息系统建设通常是由各个组织和功能单元独立完成&#xff0c;以满足各自的需求。这导致了“数据孤岛”和“数据烟囱”…

整数比较(比较4个数并从小到大输出)C语言xdoj94

描述&#xff1a; 从键盘输入四个整数&#xff0c;要求按由小到大的顺序输出。 输入说明&#xff1a; 输入四个整数&#xff0c;以空格间隔。 输出说明&#xff1a; 输出排序后的整数&#xff0c;以空格间隔。 输入样例 样例1输入 -99 9 99 -9 输出样例 样例1输出 -99 -9 9 99 …

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…

软件渗透测试有哪些测试流程?权威安全测试报告的重要性

软件渗透测试也是安全测试的一种&#xff0c;是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。作为网络安全防范的一种新技术&#xff0c;对于网络安全组织具有实际应用价值。 一、软件渗透测试的过程   软件渗透测试的过程通常包括四个主…

毕业“寄” 划算,享闪侠惠递巨额优惠福利,助你轻装向未来!

毕业季&#xff0c;你是否也为“行李难题”而烦恼&#xff01;别着急额&#xff0c;闪侠惠递来帮你&#xff0c;让您轻松寄快递&#xff0c;省时省力省心回家&#xff01; 毕业季即将来临&#xff0c;相信大家已经开始为苦读一年的自己计划一个美好的寒假暑期。而在期待假期的…

程序员自由创业周记#20:需求从何而来

程序员自由创业周记#20&#xff1a;需求从何而来 之前看过我周记的朋友应该了解我从7月份开始独立创业以来&#xff0c;主要做了两个产品&#xff0c;一个是加一&#xff0c;一个是Island Widgets - 灵动岛锁屏小组件 &#xff0c;上班的时候工作内容是上级主管分配&#xff0c…

算法与数据结构--特殊有序集的线性时间排序算法

一.计数排序算法 基本思想&#xff1a;统计每个输入元素的个数&#xff0c;然后根据这些计数值重构原数组。 使用范围&#xff1a;需要知道元素大小范围&#xff0c;就是最大值是多少。 【排序算法】计数排序_哔哩哔哩_bilibili 二.基数排序 使用场景&#xff1a;只适用于…

Java 微服务框架 HP-SOA v1.0.6 发布 — 完整支持 Dubbo 和 Spring Cloud

HP-SOA 功能完备&#xff0c;简单易用&#xff0c;高度可扩展的Java微服务框架。 项目主页 : https://www.oschina.net/p/hp-soa下载地址 : https://github.com/ldcsaa/hp-soa开发文档 : https://gitee.com/ldcsaa/hp-soa/blob/master/README.mdQQ Group: 44636872, 66390394…

前端vue keyframes动画

8.1.2 keyframes动画 transition动画适合用来创建简单的过渡效果。CSS3中支持使用animation属性来配置更加复杂的动画效果。animation属性根据keyframes配置来执行基于关键帧的动画效果。新建一个名为keyframes.vue的测试文件。编写如下代码&#xff1a; <template><…

如何实现设备远程控制?

在工业自动化领域&#xff0c;设备远程控制是一项非常重要的技术。它使得设备可以在远离现场的情况下进行远程操作和维护&#xff0c;大大提高了设备的可用性和效率。 设备远程控制的应用场景有哪些&#xff1f; 远程故障排除&#xff1a;当设备出现故障时&#xff0c;工程师…

CH06_访问数据结构

Visitor 模式 访问者模式&#xff08;Visitor&#xff09;&#xff0c;表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的提前下定义作用于这些元素的新操作。 类图 说明 Visitor&#xff08;访问者&#xff09; Visitor角色负责对数据结构中每一个…

[CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]

文章目录 前言小结 原文地址&#xff1a;https://blog.csdn.net/qq_45752541/article/details/132854115 前言 mesh 和点是最常见的3D场景表示&#xff0c;因为它们是显式的&#xff0c;非常适合于快速的基于GPU/CUDA的栅格化。相比之下&#xff0c;最近的神经辐射场&#xf…

Leaning Method

001用分布在两个地方的两台办公电脑开发一个项目&#xff0c;计划使用gitee同步代码。具体应该怎么操作&#xff1f; 要使用 Gitee 同步代码&#xff0c;你可以按照以下步骤进行操作&#xff1a; 在两台办公电脑上都安装 Git 客户端&#xff0c;并在 Gitee 上创建一个项目仓库…