「聊设计模式」之迭代器模式(Iterator)

news2024/11/26 17:22:29

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  设计模式是软件开发中经验的总结,是一种被反复使用,经过验证的通用解决方案,也是软件技术人员在设计和开发中面对常见问题时的可复用的解决方案。迭代器模式是设计模式中的一种,它可以帮助我们在不暴露集合底层实现的情况下,遍历集合中的所有元素。

摘要

  在软件开发过程中,我们经常需要遍历集合中的元素,但是如果直接使用集合提供的遍历方法,就会暴露集合底层实现的细节,迭代器模式可以解决这个问题。在本文中,我们将介绍迭代器模式的实现原理、代码示例和测试用例,希望能够帮助读者更好地理解和使用迭代器模式。

迭代器模式

概述

  迭代器模式是一种行为型设计模式,它可以帮助我们在不暴露集合底层实现的情况下,遍历集合中的所有元素。迭代器模式将遍历集合的操作封装到一个迭代器类中,客户端只需要通过迭代器的接口就可以遍历集合中的元素。

结构

迭代器模式有以下几个角色:

  • 抽象聚合类(Aggregate),定义集合对象的接口,封装了集合底层实现的细节,提供了一个可以遍历集合中元素的抽象方法。
  • 具体聚合类(ConcreteAggregate),实现抽象聚合类中的抽象方法,返回一个具体的迭代器。
  • 抽象迭代器类(Iterator),定义遍历集合元素的接口,包括获取下一个元素、判断是否遍历完毕等方法。
  • 具体迭代器类(ConcreteIterator),实现抽象迭代器类中定义的方法,负责遍历集合中的元素。

其迭代器模式结构图如下所示:

在这里插入图片描述

迭代器模式优缺点

优点

迭代器模式的优点是:

  • 封装性好,客户端不需要知道集合内部结构,就可以遍历集合中的元素。
  • 对于不同的集合类型,我们可以定义不同的迭代器,从而实现不同的遍历方法。

缺点

迭代器模式的缺点是:

  • 迭代器模式增加了类的数量,如果需要遍历的集合比较简单,使用迭代器模式可能会增加不必要的复杂性。
  • 遍历集合时,如果有多个线程同时进行遍历操作,需要对迭代器对象进行同步操作,这会影响程序的性能。

使用场景

迭代器模式的场景包括:

  1. 需要遍历一个聚合对象(如一个列表、数组等)中的元素,但是不想暴露聚合对象的内部结构。

  2. 需要对聚合对象进行多种方式的遍历,如顺序遍历、倒序遍历等。

  3. 需要在遍历过程中实现某些操作,如筛选、过滤等。

  4. 需要在多个不同的聚合对象上进行相同的操作,而不需要关心它们的具体实现。

  5. 需要提供一种统一的遍历接口,以便客户端可以使用相同的方式处理不同的聚合对象。

例子:

  1. 遍历一个网站上的文章列表,以便按照用户的需求进行排序、搜索等操作。

  2. 遍历一个电商平台上的商品列表,以便实现商品的分类、筛选、排序等操作。

  3. 遍历一个音乐播放器中的歌曲列表,以便实现歌曲的随机播放、循环播放等操作。

  4. 遍历一个数据库中的数据表,以便实现数据的增删改查等操作。

迭代器模式实现

下面通过Java代码来实现一个简单的迭代器模式:

抽象聚合类

package com.example.javaDesignPattern.iterator;

import java.util.Iterator;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:31
 */
public interface Aggregate {
    public void add(Object obj);

    public void remove(Object obj);

    public Iterator getIterator();
}

具体聚合类

package com.example.javaDesignPattern.iterator;

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

/**
 * @Author bug菌
 * @Date 2023-09-19 22:32
 */
public class ConcreteAggregate implements Aggregate {
    private List<Object> list = new ArrayList<>();

    public void add(Object obj) {
        list.add(obj);
    }

    public void remove(Object obj) {
        list.remove(obj);
    }

    public ConcreteIterator getIterator() {
        return new ConcreteIterator(list);
    }
}

抽象迭代器类

package com.example.javaDesignPattern.iterator;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:32
 */
public interface Iterator {
    public Object next();

    public boolean hasNext();
}

具体迭代器类

package com.example.javaDesignPattern.iterator;

import java.util.List;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:32
 */
public class ConcreteIterator implements Iterator {
    private List<Object> list;
    private int index = 0;

    public ConcreteIterator(List<Object> list) {
        this.list = list;
    }

    public Object next() {
        if (hasNext()) {
            return list.get(index++);
        }
        return null;
    }

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

测试代码

package com.example.javaDesignPattern.iterator;

/**
 * @Author bug菌
 * @Date 2023-09-19 22:33
 */
public class IteratorPatternTest {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("aaa");
        aggregate.add("bbb");
        aggregate.add("ccc");
        Iterator iterator = aggregate.getIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

  在上面的代码中,我们通过抽象聚合类 Aggregate 和具体聚合类 ConcreteAggregate 封装了集合底层实现的细节,提供了一个可以遍历集合中元素的抽象方法 getIterator()。同时,我们定义了抽象迭代器类 Iterator 和具体迭代器类 ConcreteIterator,它们负责实现遍历集合中元素的具体操作,包括获取下一个元素和判断是否遍历完毕等方法。

  在测试代码中,我们创建了一个具体聚合类的实例 aggregate,并向其中添加了三个元素。然后通过调用 aggregategetIterator() 方法获取一个具体迭代器实例 iterator,并通过 while 循环遍历了集合中的所有元素。

测试结果如下:

在这里插入图片描述

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

  在本文中,我们介绍了迭代器模式的实现原理、代码示例和测试用例。迭代器模式是一种可以帮助我们在不暴露集合底层实现的情况下,遍历集合中的所有元素的设计模式。它将遍历集合的操作封装到一个迭代器类中,客户端只需要通过迭代器的接口就可以遍历集合中的元素。迭代器模式的优点是封装性好,支持多种遍历方法,缺点是增加了类的数量,可能会影响程序性能。通过本文的介绍,相信读者已经对迭代器模式有了更深入的理解,可以在实际开发中更

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

开学季什么触控笔好用又便宜?推荐平价的电容笔

由于iPad平板的强大功能&#xff0c;才让iPad拥有了更多的用户。拿来画画、记笔记什么的体验都是很不错。但是仅仅是拿来看电视、玩游戏&#xff0c;似乎作用不大。如果你不是想要一支昂贵的苹果电容笔&#xff0c;或者只是想要在日常生活中做笔记&#xff0c;那么你可以考虑一…

springcloud3 分布式事务解决方案seata之TCC模式6

一 TCC模式 1.1 TCC的逻辑 TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC需要人工干预编写代码。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和预留&#xff1b; Confirm&#xff1a;完成资源操作业务&#xff1b;要求 Try 成…

three.js——几何体划分顶点添加不同的材质

几何体划分顶点添加不同的材质 前言效果图.addGroup(顶点的下标, 获取几个顶点, 选择材质的下标)在vue中使用 前言 上篇文章讲解了怎样通过索引划分顶点&#xff0c;通过顶点绘制图形,本章通过addGroup方法讲解根据划分的顶点来添加不同的材质 效果图 .addGroup(‘顶点的下标’…

精品SpringCloud电影院购票系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的电影院购票系统设计的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版…

【JDK 8-集合框架进阶】6.1 parallelStream 并行流

一、parallelStream 并行流 1.1 串行 和 并行的区别 > 执行结果 二、问题 2.1 paralleStream 并行是否一定比 Stream 串行快? 2.2 是否可以都用并行&#xff1f; > 报错 三、实战 > 执行结果 四、总结 一、parallelStream 并行流 多线程并发处理&#xff…

视频号:平均一场裂变7965人,电商增长玩法全揭秘!

我们整理了几何裂变平台上电商行业近3个月的视频号裂变活动&#xff0c;发现用的最多的玩法是粉丝裂变&#xff0c;其次是直播裂变。 平均一场视频号粉丝裂变活动涨粉7965人&#xff0c;裂变层级9级&#xff0c;裂变率872%&#xff0c;即1个老用户能带来8.72个新用户关注视频号…

数字孪生基础设施需求分析

数字孪生基础设施需求分析 “基础设施”&#xff08;infrastructure&#xff09;新型基础设施建设 “基础设施”&#xff08;infrastructure&#xff09; 一词最早于1875年在法文中出现&#xff0c;但该词汇由拉丁文构成&#xff0c;infrastructure分为infra&#xff08;拉丁文…

汽车电子——产品标准规范汇总和梳理(适应可靠性)

文章目录 前言 一、电气性能要求 二、机械性能要求 三、气候性能要求 四、材料性能要求 五、耐久性能要求 六、防护性能要求 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、电气性能要求 《GB/T 28046.2-2019&#xff08;ISO 16750-2&#xff1a;2012&#…

算法简述-串和串的匹配、排序、深度/广度优先搜索、动态规划、分治、贪心、回溯、分支限界

目录 算法简述 基本 典型算法列举 串和串的匹配 排序 深度/广度优先搜索 动态规划 分治 贪心 回溯 分支限界 算法简述 基本 咳咳嗯…算法嘛&#xff0c;咱也不是 CS 科班学生&#xff0c;咱就说&#xff0c;算法是对已经建模后的问题的解决的具体途径和方法&#x…

A-小美种果树(二分)-- 牛客周赛 Round 12

输入 1 2 10 输出 6 解析&#xff1a; 二分&#xff0c;注意两端端点L、R的取值&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std; #define int long long int x,y,z; signed main(){scanf("%lld%lld%lld",&x,&y,…

链表反转-两两交换链表中的节点

LeetCode24.给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。必须在不修改节点内部的值的情况下完成本题(即&#xff0c;只能进行节点交换) 如果原始顺序是 dummyHead -> node1 -> node2&#xff0c;交换后面两个节点关系要变成 …

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

短视频账号矩阵运营

短视频伴随着用户数量的不断增加&#xff0c;越来越多的企业开始将短视频纳入其品牌推广和营销战略中。然而&#xff0c;短视频矩阵账号运营并非易事&#xff0c;需要一定的策略和技巧。本文将探讨短视频矩阵账号运营的方法和常见问题&#xff0c;并提供解决方案。 一、策略和…

加强半圆头方颈螺栓的型式尺寸

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了加强半圆头方颈螺栓的型式尺寸、技术条件和标记。 本文件适用于螺纹规格为 M6&#xff5e;M20, 产品等级为 B 级(A 型)和 C 级(B 型)的加强…

【Vue】修饰符表单提交方式自定义组件

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

[MySQL]基本介绍及安装使用详细讲解

简单介绍 数据库 (DataBase)&#xff0c;简称DB 顾名思义&#xff0c;即存储数据的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统(DataBase Management System)&#xff0c;简称DBMS 管理数据库的大型软件 SQL(Structured Query Language)&#xff0c;简称SQL&…

(附12306抢票脚本)国庆长假马上来啦,Python分析【去哪儿旅游攻略】数据,制作可视化图表

目录 前言环境使用模块使用数据来源分析 代码实现导入模块请求数据解析保存 数据可视化导入模块、数据年份分布情况月份分布情况出行时间情况费用分布情况人员分布情况 前言 2023年的中秋节和国庆节即将来临&#xff0c;好消息是&#xff0c;它们将连休8天&#xff01;这个长假…

java学习--day10 (继承)

文章目录 day9作业今天的内容1.继承1.1.生活中的继承1.2.Java中继承1.3关于父类子类的内存分析1.4重写【重点】1.5重载【overload】 day9作业 1.构造代码块和构造方法的区别 &#xff5b;代码块 &#xff5d; public 类名 () {} 都是实例化一个对象的时候执行的 只不过构造代码…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型&#xff08;pygame&#xff09;&#xff0c;但是我是使用 SSH 连接的&#xff0c;不能很好的显示模型训练的效果画面&#xff0c;所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注&#xff1a;我们…

面试官:什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、什么是虚拟DOM 二、为什么需要虚拟DOM 三、如何实现虚拟DOM 小结 一、什么是虚拟DOM 虚拟 DOM &#xff08…