深入浅出设计模式 - 迭代器模式

news2024/9/23 19:28:28

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

在这里插入图片描述

文章目录

  • 1、什么是迭代器模式
  • 2、迭代器模式的优缺点
  • 3、迭代器模式的应用场景
  • 4、迭代器模式的结构
  • 5、迭代器模式的原理
  • 6、迭代器模式的代码案例

1、什么是迭代器模式

迭代器模式是一种行为设计模式,它允许按照特定顺序访问聚合对象中的元素,而无需暴露其内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,而不需要了解其底层实现。

在迭代器模式中,聚合对象包含一个迭代器,该迭代器用于遍历聚合对象中的元素。迭代器提供了一组方法,如获取下一个元素、判断是否还有下一个元素等。通过使用迭代器,客户端代码可以独立于聚合对象的具体类型来遍历元素。

迭代器模式的优点包括简化聚合对象的接口、提供一种统一的遍历方式、支持多种遍历方式等。它可以使代码更加灵活和可扩展,同时也符合面向对象设计的原则。

总结来说,迭代器模式是一种用于遍历聚合对象的设计模式,它提供了一种统一的方式来访问聚合对象中的元素,从而提高了代码的灵活性和可扩展性。

2、迭代器模式的优缺点

迭代器模式的优点包括:

  1. 简化聚合对象的接口:迭代器模式将遍历集合的责任封装在迭代器中,使得聚合对象不需要暴露其内部结构,从而简化了聚合对象的接口。

  2. 统一的遍历方式:迭代器模式提供了一种统一的遍历方式,无论聚合对象的类型如何,都可以使用相同的迭代器接口进行遍历操作。

  3. 支持多种遍历方式:迭代器模式可以定义多个不同的迭代器类,每个迭代器类可以以不同的方式遍历聚合对象,从而满足不同的遍历需求。

  4. 提高代码灵活性和可扩展性:由于迭代器模式将遍历操作与聚合对象分离,使得可以独立地修改聚合对象或迭代器的实现,而不会相互影响,从而提高了代码的灵活性和可扩展性。

迭代器模式的缺点包括:

  1. 增加了类的数量:引入迭代器模式会增加额外的迭代器类,可能会增加代码量和复杂度。

  2. 遍历过程中的修改问题:如果在遍历过程中修改了聚合对象,可能会导致迭代器的状态和聚合对象的状态不一致,需要特别注意遍历过程中的修改操作。

综上所述,迭代器模式具有简化接口、统一遍历方式、支持多种遍历方式以及提高代码灵活性和可扩展性等优点,但也需要注意增加类的数量和遍历过程中的修改问题。

3、迭代器模式的应用场景

迭代器模式在以下情况下可以应用:

  1. 需要遍历一个聚合对象的元素,但又不希望暴露其内部表示。迭代器模式可以提供一种统一的方式来遍历聚合对象,而不需要了解其具体实现。

  2. 需要在不同的聚合对象上使用统一的遍历方式。迭代器模式可以定义一个通用的迭代器接口,使得可以在不同的聚合对象上使用相同的迭代器进行遍历操作。

  3. 需要支持多种遍历方式。迭代器模式可以定义多个不同的迭代器类,每个迭代器类可以以不同的方式遍历聚合对象,从而满足不同的遍历需求。

  4. 需要遍历的聚合对象可能有不同的底层实现。迭代器模式可以将遍历操作与具体的聚合对象实现分离,使得可以独立地修改聚合对象的实现,而不会影响遍历的代码。

  5. 需要提供一种安全的遍历方式。迭代器模式可以在遍历过程中保护聚合对象,防止非法访问或修改。

总之,迭代器模式适用于需要遍历聚合对象的场景,同时希望将遍历操作与聚合对象的具体实现分离的情况。它可以提供一种统一的、灵活的遍历方式,同时支持多种遍历需求。

4、迭代器模式的结构

迭代器模式的结构包括以下几个角色:

  1. 抽象迭代器(Iterator):定义了访问和遍历聚合对象元素的接口,包括获取下一个元素、判断是否还有元素等方法。

  2. 具体迭代器(ConcreteIterator):实现了抽象迭代器接口,负责具体的遍历聚合对象的操作,记录当前遍历位置等。

  3. 抽象聚合对象(Aggregate):定义了创建迭代器对象的接口,可以是一个抽象类或接口,提供了获取迭代器的方法。

  4. 具体聚合对象(ConcreteAggregate):实现了抽象聚合对象的接口,创建具体的迭代器对象,实现了具体的聚合对象的操作。

  5. 客户端(Client):使用迭代器模式的代码,通过迭代器遍历聚合对象的元素。

迭代器模式的核心思想是将遍历操作封装在迭代器中,使得聚合对象的内部结构对外隐藏,客户端只需要通过迭代器访问聚合对象的元素,从而实现了聚合对象与遍历操作的分离。这样可以提供一种统一的、灵活的遍历方式,同时支持多种遍历需求。

5、迭代器模式的原理

迭代器模式的原理是通过将遍历操作封装在迭代器对象中,实现对聚合对象的遍历访问。具体来说,迭代器模式包括以下几个步骤:

  1. 定义抽象迭代器接口(Iterator),其中包括一些用于遍历聚合对象的方法,如获取下一个元素、判断是否还有元素等。

  2. 在具体迭代器类(ConcreteIterator)中实现抽象迭代器接口,具体实现遍历聚合对象的操作。具体迭代器类通常会持有一个对应的聚合对象,并记录当前遍历位置等状态信息。

  3. 定义抽象聚合对象接口(Aggregate),其中包括一个用于创建迭代器对象的方法。抽象聚合对象可以是一个抽象类或接口,具体实现类需要实现该方法。

  4. 在具体聚合对象类(ConcreteAggregate)中实现抽象聚合对象接口,创建具体的迭代器对象。具体聚合对象类通常会持有一个聚合对象的集合,并在创建迭代器时将自身作为参数传递给迭代器。

  5. 在客户端代码中,通过抽象聚合对象接口获取迭代器对象,然后使用迭代器对象进行遍历操作。客户端代码不需要了解具体的聚合对象和迭代器实现,只需要通过迭代器接口进行遍历操作。

迭代器模式的核心思想是将遍历操作封装在迭代器对象中,使得聚合对象的内部结构对外隐藏,客户端只需要通过迭代器访问聚合对象的元素,从而实现了聚合对象与遍历操作的分离。这样可以提供一种统一的、灵活的遍历方式,同时支持多种遍历需求

6、迭代器模式的代码案例

定义抽象迭代器接口

package com.pany.camp.design.principle.iterator;

/**
 *
 * @description:  定义抽象迭代器接口
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 20:10
 */
public interface Iterator<T> {
    
    boolean hasNext();
    
    T next();
}

定义具体迭代器类

package com.pany.camp.design.principle.iterator;

import java.util.List;

/**
 *
 * @description:  定义具体迭代器类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 20:11
 */
public class ConcreteIterator<T> implements Iterator<T> {

    private List<T> collection;

    private int index;

    public ConcreteIterator(List<T> collection) {
        this.collection = collection;
        this.index = 0;
    }

    public boolean hasNext() {
        return index < collection.size();
    }

    public T next() {
        if (hasNext()) {
            T item = collection.get(index);
            index++;
            return item;
        }
        return null;
    }
}

定义抽象聚合对象接口

package com.pany.camp.design.principle.iterator;

/**
 *
 * @description:   定义抽象聚合对象接口
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-28 20:12
 */
public interface Aggregate<T> {

    Iterator<T> createIterator();
}

定义具体聚合对象类

package com.pany.camp.design.principle.iterator;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @description:  定义具体聚合对象类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 20:13
 */
public class ConcreteAggregate<T> implements Aggregate<T> {
    
    private List<T> collection;

    public ConcreteAggregate() {
        this.collection = new ArrayList<>();
    }

    public void addItem(T item) {
        collection.add(item);
    }

    public Iterator<T> createIterator() {
        return new ConcreteIterator<>(collection);
    }
}

客户端:

package com.pany.camp.design.principle.iterator;

/**
 *
 * @description:  客户端代码
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-28 20:13
 */
public class Client {
    
    public static void main(String[] args) {
        ConcreteAggregate<Integer> aggregate = new ConcreteAggregate<>();
        aggregate.addItem(1);
        aggregate.addItem(2);
        aggregate.addItem(3);

        Iterator<Integer> iterator = aggregate.createIterator();
        while (iterator.hasNext()) {
            Integer item = iterator.next();
            System.out.println(item);
        }
    }
}

我们定义了抽象迭代器接口(Iterator)和具体迭代器类(ConcreteIterator),以及抽象聚合对象接口(Aggregate)和具体聚合对象类(ConcreteAggregate)。客户端代码通过创建具体聚合对象并获取迭代器,然后使用迭代器遍历聚合对象中的元素。

输出如下:

1
2
3

Process finished with exit code 0

在这里插入图片描述

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊
在这里插入图片描述

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

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

相关文章

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Firefox开启TLS 1.1支持 问题&#xff1a; 建立安全连接失败 连接到…时发生错误。对等端使用了不支持的安全协议版本。 错误代码&#xff1a;SSL_ERROR_UNSUPPORTED_VERSION 由于不能验证所收到的数据是否可信&#xff0c;无法显示您想要查看的页面。 建议向此网站的管理…

Ubuntu TensorRT安装

文章目录 1.1环境1.2下载地址1&#xff09;操作步骤2&#xff09;添加环境变量3&#xff09;检查是否安装成功 2.1其它环境 1.1环境 1&#xff09;Ubuntu20.04 2&#xff09;cuda111torch1.8.0py38 1.2下载地址 https://developer.nvidia.com/nvidia-tensorrt-download 1…

【Linux】线程同步(一)

概念 线程同步是指多个线程之间协调和管理彼此的执行顺序&#xff0c;以避免竞态条件和不确定的结果。线程同步的目的是确保共享资源的正确访问和保护临界区的完整性。 作用 避免竞态条件&#xff1a;当多个线程同时访问和修改共享资源时&#xff0c;可能会导致竞态条件的发生…

javaee session的创建

当访问服务器时&#xff0c;服务器就会创建一个session TestSession.java package com.yyy.servlet;import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java…

String、反射、枚举、lambda表达式以及泛型进阶(数据结构系列16)

目录 前言&#xff1a; 1. String 1.1 字符串常量池 1.1.1 创建对象的思考 1.1.2 字符串常量池&#xff08;StringTable&#xff09; 1.1.3 再谈String对象创建 1.1.4 intern方法 2. 反射 2.1 反射的定义 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相关的类 2.4.…

Android实现发送短信功能

Android发送短信 效果图代码实现先添加权限.java由用户输入手机号 自定义短信内容跳转系统发送短信页面 自定义手机号短信内容全部代码 .xml 效果图 代码实现 先添加权限 <!-- 允许程序发送SMS短信 --><uses-permission android:name"android.permission.SEND_S…

nodejs线上环境远程调试

将nodejs部署到线上环境之后&#xff0c;这个时候想要去调试还是有点困难的&#xff0c;但是好在nodejs提供了一个可以让你进行调试的开关&#xff1a;--inspect 我们可以使用这个开关来启动一个可以调试的服务&#xff0c;使用非常简单&#xff0c;在启动服务的时候加上这个指…

高性能计算怎么入门?

如果入门没有专业方向&#xff0c;自学摸索的话&#xff0c;不容易有自己的核心竞争力。国内目前生态尚不完善&#xff0c;学习资料也比较少~如果想要系统学习的话&#xff0c;一定不要错过国内首家专业做高性能计算的系统学习课程。 ~我们是国内首家做高性能计算人才培养和推…

微型逆变器会不会迎来CC2340时代

光伏领域的朋友对微型逆变器并不陌生。而CC2340&#xff0c;对大家而言则都是陌生的主。它是何方神仙&#xff1f;和微型逆变器能有什么关系&#xff1f;你还说它可能引领微型逆变器的下一个时代&#xff1f;不急&#xff0c;我们一起来看看。 在全球为双碳愿景努力以及俄乌战…

VR虚拟展会——打造商企展厅线上展示新模式

近期的大雨磅礴&#xff0c;不知道大家都感受过吗&#xff1f;就连在武汉展开的国际连锁加盟展产业博览会也都受到了一定的影响&#xff0c;为期三天的展会&#xff0c;接连下了三天的雨&#xff0c;导致很多客户无缘展会。这就是实体展会的限制之一&#xff0c;加上实体展会的…

vscode修改markdown侧边预览pdf字体等设置

文章目录 1.按CtrlShiftP打开命令窗口2.在命令窗口出输入Markdown Preview Enhanced: Customize Css&#xff0c;打开style.less文件 1.按CtrlShiftP打开命令窗口 2.在命令窗口出输入Markdown Preview Enhanced: Customize Css&#xff0c;打开style.less文件 然后在文件内加…

【网站维护】网络杂谈(7)之web网站的维护

涉及知识点 如何进行web网站的维护&#xff0c;如何进行web网站的更新与测试&#xff0c;搭建web网站后期如何管理维护。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1&#xff0e;网…

仿牛客社区——7.19生成长图

采用异步方式&#xff0c;通过任务方式&#xff0c;将次命令丢到消息队列中进行执行 关于wkhtmltopdf的配置&#xff08;applaction.properties&#xff09; #关于wk的配置&#xff08;生成长图 wk.image.commandD:/wkhtmltopdf/bin/wkhtmltoimage wk.image.storageD:/wkData/w…

婴儿摇篮音乐芯片 N9300-S16:为宝宝带来高品质的音乐体验

​对于父母来说&#xff0c;给婴儿提供一个安稳舒适的睡眠环境是至关重要的。宝宝的睡眠品质对于其健康和发展至关重要。在成长过程中&#xff0c;音乐对婴儿的情绪、认知和智力发展都有积极的影响。因此&#xff0c;厂家在婴儿摇篮中选择一款合适的婴儿摇篮音乐芯片尤为重要。…

共见·价值成就|亚马逊云科技中国峰会宣布三大举措全面升级

2023年6月27日&#xff0c;亚马逊云科技举办一年一度的中国合作伙伴峰会。本届峰会以“共见价值成就”为主题&#xff0c;面向合作伙伴发布智荟出海计划、可持续发展伙伴计划、合作伙伴解决方案工厂以及获客激励计划等多项计划&#xff0c;以进一步强化合作伙伴“33战略”&…

ASEMI代理ST可控硅BTA16的工作原理与应用分析

编辑-Z 本文将对可控硅BTA16的工作原理与应用进行详细的分析。首先&#xff0c;我们将介绍可控硅BTA16的基本概念和工作原理&#xff0c;然后&#xff0c;我们将探讨其在电力电子设备中的应用&#xff0c;接着&#xff0c;我们将分析其在电力调节中的作用&#xff0c;最后&…

edge自带断网游戏

在没有网络时你会不会很无聊&#xff1f;博主告诉你一个edge浏览器自带的断网小游戏&#xff0c;让你在断网时也能玩游戏&#xff01; 网址&#xff1a; 打开edge://surf这个断网游戏网站即可游玩&#xff1a; 作弊码既隐藏模式&#xff1a; 输入microsoft&#xff08;意思就…

C语言学习(二十八)---字符串相关函数

在上一节的内容结束后&#xff0c;有关指针的内容就告一段落了&#xff0c;指针是开发中非常重要的一环&#xff0c;大家务必要对其深入理解并且掌握&#xff0c;今天我们将继续往下学习&#xff0c;主要学习字符串操作相关的函数&#xff0c;分为不限制长度和限制长度两种&…

vetcor使用移动构造取代拷贝构造实现push_back

昨天说到&#xff1a;vector变量push_back一个对象或变量的时候&#xff0c;本质上是执行拷贝构造&#xff0c;但我想使用移动构造&#xff0c;而不是拷贝构造&#xff0c;本文就修改调试过程&#xff0c;详细分析如何实现移动构造。 昨天的代码如下&#xff1a;(如果有人想测…

Keil5 创建工程

一、 在桌面新建一个 TEST 的文件夹&#xff0c;然后在 TEST 文件夹里面新建 USER 文件夹&#xff0c;将工程名 字设为 test&#xff0c;保存在这个 USER 文件夹里面,选择对应芯片的安装包 启动代码作用&#xff1a; 1、堆栈&#xff08;SP&#xff09;的初始化&#xff1b; 2…