23种设计模式之迭代器模式(Iterator Pattern)

news2025/2/24 18:02:20

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始
在这里插入图片描述

文章目录

  • 迭代器模式概念
  • 迭代器模式构成部分
  • 迭代器模式案例
  • 迭代器模式小结

迭代器模式概念

迭代器模式是一种对象行为型设计模式。它提供了遍历集合对象所需的标准接口,而不暴露集合对象的实现方式

在Java编程中,常见的集合类包括List、Set和Map等,这些都内部维护着一个元素列表。通过迭代器模式,对于任何一种集合对象,在不了解其内部实现的情况下,都可以轻松地遍历其中的每个元素,从而简化了代码的编写和维护。

迭代器模式构成部分

迭代器模式由两个主要组成部分构成:迭代器(Iterator)和可迭代对象(Iterable)。迭代器用于定义访问和遍历元素的接口,而可迭代对象用于返回迭代器。

下面是迭代器模式的基本结构:

迭代器(Iterator):定义访问和遍历聚合对象元素的接口;
具体迭代器(ConcreteIterator):实现迭代器接口,并对聚合对象进行遍历和存储当前遍历位置等操作;
可迭代对象(Iterable):定义获取迭代器的接口;
具体可迭代对象(ConcreteIterable):实现可迭代对象接口,返回具体的迭代器实例。
迭代器模式的使用步骤如下:

定义聚合对象的对象结构,包含 add()、remove()和 get()等方法;
定义迭代器接口 Iterator,并声明 getFirst()、getNext()、isDone() 和 getCurrentItem() 方法;
实现具体迭代器 ConcreteIterator 类,维护一个指向当前位置的指针,实现 Iterator 接口中的方法实现元素遍历;
实现可迭代对象 Iterable 接口,并实现创建迭代器实例的方法 iterator();
在客户端代码中使用该聚合对象和迭代器通过 hasNext()、next() 等方法对集合对象进行访问和遍历。
总之,迭代器模式是一种非常有用且广泛应用于实际开发的设计模式,它可以有效地解耦集合对象和其遍历方式,使得代码更加简洁和易于维护。

迭代器模式案例

假设我们有一个存储了学生信息的集合类 StudentList,包含了 addStudent()、removeStudent()和 getStudent()等方法。现在,我们需要基于迭代器模式来遍历这个学生信息集合。具体步骤如下:

定义迭代器接口 Iterator:

public interface Iterator {
    public boolean hasNext();
    public Object next();
}

实现具体的迭代器类 ConcreteIterator:

public class ConcreteIterator implements Iterator {
    private StudentList studentList;
    private int index = 0;

    public ConcreteIterator(StudentList list) {
        this.studentList = list;
    }

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

    @Override
    public Object next() {
        if (hasNext()) {
            return studentList.getStudent(index++);
        }
        return null;
    }
}

定义可迭代对象接口 Iterable:

public interface Iterable {
    public Iterator iterator();
}

实现具体的可迭代对象类 ConcreteIterable:

public class ConcreteIterable implements Iterable {
    private StudentList studentList;

    public ConcreteIterable(StudentList list) {
        this.studentList = list;
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(studentList);
    }
}

在客户端代码中使用聚合对象和迭代器进行遍历:

public static void main(String[] args) {
    StudentList list = new StudentList();
    list.addStudent("Tom");
    list.addStudent("Mary");
    list.addStudent("John");

    ConcreteIterable iterable = new ConcreteIterable(list);
    Iterator iterator = iterable.iterator();
    while (iterator.hasNext()) {
        String name = (String) iterator.next();
        System.out.println(name);
    }
}

上面的代码中,我们首先定义了迭代器接口 Iterator,并在迭代器具体实现类 ConcreteIterator 中实现了遍历集合对象的逻辑。然后,我们定义了可迭代对象接口 Iterable,并在其实现类 ConcreteIterable 中返回具体的迭代器实例。最后,在客户端代码中使用该聚合对象和迭代器通过 hasNext()、next() 等方法对集合对象进行访问和遍历。

迭代器模式小结

总的来说,迭代器模式将聚合对象和遍历方式分离,提供了一种通用的遍历机制,使得不同类型的集合对象均可以方便地进行遍历,并且通过迭代器接口也可以更加灵活地定义迭代器的行为

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

今天公司来了个拿 30K 出来的测试,实在太牛了....

今天上班开早会就是新人见面仪式&#xff0c;听说来了个很厉害的大佬&#xff0c;年纪还不大&#xff0c;是离职过来的&#xff0c;薪资已经达到中高等水平&#xff0c;很多人都好奇不已&#xff0c;能拿到这个薪资应该人不简单&#xff0c;果然&#xff0c;自我介绍的时候都惊…

无惧面试,2023最新最全Java面试手册全网首次开放下载

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 ​基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff…

vue2介绍(入门)

目录 声明式渲染 v-bind v-if条件与循环 name命名 学会log打印 一些js方法 双向绑定v-model和v-bind 那么请实现一个复选框吧 自定义标签模板 声明式渲染 我感觉这里文档的意思是双向绑定&#xff0c; 或许需要清理一下js缓存机制 &#xff0c;嗯...不懂,响应式&…

视频理解学习笔记(三)

视频理解学习笔记&#xff08;三&#xff09; 时间梳理结果对比从hand-crafted到deep-learningDeepVideo论文概览 (Slow Fusion) Two-Stream and Its VariantsTwo-Stream CNN (Late Fusion)Beyond Short Snippets (Two-Stream LSTM/ConvPooling)3DConv 3DPool, Early Fusion …

Java学习路线(14)——Map集合类

一、介绍 概念 Map集合是一种双列集合&#xff0c;每个元素包含两个数据。元素格式&#xff1a;【keyvalue】键值对元素Map又称为 “键值对集合” Map集合格式&#xff1a; {key1value1,key2value2,key3value3,…} 二、Map集合的特点 Map家族图 1、说明&#xff1a; 使用…

期末复习总结【MySQL】库和表的基本操作 + 增删改查CURD

文章目录 前言一、数据库的基本操作1, 查看库2, 创建库3, 使用库4, 删除库 二、表的基本操作1, 创建表2, 查看表3, 查看表结构4, 删除表 三、增加(Create)四、查询(Retrieve) (重点)1, 全列查询2, 指定列查询3, 查询字段为表达式4, 指定别名5, 去重6, 排序7, 条件查询7.1, 基本…

Hbase操作

(1) 启动 启动顺序&#xff1a;Hadoop--zookeeper—hbase 主进程&#xff1a;HMaster 从进程&#xff1a;HRegionServer 确认进程是否正常 (2) 进入终端 [rootmaster ~]# hbase shell (3) 查看状态 命令&#xff1a;status 表示有3台机器&#xff0c;0台down掉&…

软件测试3年以为的躺平了,没想到还得内卷,这题太难了...

前段时间我同事&#xff08;做测试的一个妹子&#xff09;跟我讲&#xff0c;感觉早上起来十分的疲惫&#xff0c;不想上班&#xff0c;问我们这是什么样的现象&#xff0c;其实有时候我也有这种感觉&#xff0c;虽然我卷&#xff0c;但我也是肉体凡胎啊&#xff01;不是机器人…

Qt, Text Edit 和 Plain Text Edit关于调整字体样式的问题

问题: 在编写小案例的过程中需要使用一个文本容器用于显示文本效果, 因为涉及文本字体的 加粗, 倾斜, 下划线, 以及颜色效果, 这里使用了 Text Edit 组件, 但是使用后发现容器中的文本无法实现同时设置 加粗 倾斜 下划线的情况, 且单独设置时只有 下划线 有效果, 加粗 倾斜 均无…

C++模板(详解)

非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参&#xff1a; 出现在模板参数列表中&#xff0c;跟在class或typename关键字之后的参数类型名称。非类型形参&#xff1a; 用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#xff…

字节跳动测试岗面试挂在二面,我复盘总结了失败原因,决定再战一次

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

hystart++ 出炉

周三早上同事发我一个 rfc 9406 链接&#xff0c;microsoft hystart 标准化了&#xff0c;此前只是一个 draft。 说说我的看法。 信收敛不信测量&#xff0c;tcp 是端到端高熵体&#xff0c;对网络一无所知&#xff0c;过度信任测量则无法消除长尾&#xff0c;且可能劣化 p99…

Metasploit入门教程(非常详细)从零基础入门到精通,看完这一篇就够了!

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

【牛客刷题专栏】0x32:JZ45 把数组排成最小的数(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

【算法】LFU及其优化

文章目录 什么是LFU&#xff1f;设计思路代码实现&#xff08;基础版本&#xff09;参考论文代码实现&#xff08;优化版本&#xff09;区别 什么是LFU&#xff1f; LRU及其实现 上文讲解了LRU&#xff0c;他是一个基于最近是否被访问来做缓存淘汰的策略。 那么今天介绍一个新…

Postman的简单使用:

1. Postman 1.1 背景 当前主流的开发模式为&#xff1a;前后端分离开发。 前端人员开发前端工程&#xff0c;后端人员开发后端工程&#xff0c;只需要依据这份接口文档即可。在后端开发过程中每开发完一个功能&#xff0c;就需要对这个功能接口进行测试&#xff0c;由于现在是…

图灵完备游戏:信号计数 解法记录

使用1个全加器 2个半加器完成。这关的思想主旨在于如何把输出4&#xff0c;输出2&#xff0c;输出1的情况统一在一根导线上。 首先用一个全加器来完成输入2-4这三个引脚的计数&#xff0c;因为全加器输出范围二进制是00 - 11&#xff0c;而输入正好有两个引脚数位是2和1&…

linux周六串讲

esc. //粘贴复制上一条命令的参数 cat /etc/resolv.conf //查看DNS地址 route -n //查看网关 hostname //临时修改主机名 hostnamectl set-hostname 名称 //永久修改主机名 ssh root192.168.10.233 //用windows远程的格式&#xff0c;在CMD窗口输入这个命令 …

MYSQL数据库测评及整改

1、查询数据库版本&#xff1a;select version(); 2、查询已安装的插件&#xff1a;show plugins; 3、查询插件安装的位置&#xff1a; show variables like "%plugin_dir%"; 4、查询用户&#xff1a;选择数据库&#xff1a; select host,user,plugin from user; 5、…

Read View 数据快照,在MVCC里是如何工作的?

Read View 数据快照&#xff0c;在MVCC里是如何工作的&#xff1f; Read View 有四个重要的字段&#xff1a; ● m_ids &#xff1a;指的是在创建 Read View 时&#xff0c;当前数据库中「活跃事务」的事务 id 列表&#xff0c;注意是一个列表&#xff0c;“活跃事务”指的就…