设计模式学习——迭代器模式

一个车载HUD的设计参考 阅读详情



迭代器模式的介绍

  1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式
  2. 如果我们的集合元素是用不同的方式实现的,有数组、还有java的集合类、或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。
  3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

原理类图

在这里插入图片描述
对原理类图的说明-即(迭代器模式的角色及职责)

  1. Iterator:迭代器接口,是系统提供,包含hasNext,next,remove
  2. ConcreteIterator:具体的迭代器类,管理迭代
  3. Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦
  4. ConcreteAggregate:具体的聚合,持有对象集合,并提供一个方法,返回一个迭代器可以正确遍历集合
  5. Client:客户端,通过Iterator和Aggregate依赖子类

迭代器模式实例类图

在这里插入图片描述

迭代器模式实例代码

具体的迭代器类,管理迭代

public class ComputerCollegeIterator implements Iterator {

    //这里我们需要Department 是以怎样的方式存放
    Department[] departments;

    int postion = 0; //遍历的位置

    public ComputerCollegeIterator(Department[] departments) {
        this.departments = departments;
    }

    //判断是否含有下一个元素
    @Override
    public boolean hasNext() {
        if (postion >= departments.length || departments[postion] == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Object next() {
        Department department = departments[postion];
        postion += 1;
        return department;
    }

    public void remove(){

    }
}
public class InfoColleageIterator implements Iterator {

    List<Department> departmentList; //信息工程学院是以List方式存放的
    int index = -1;

    public InfoColleageIterator(List<Department> departmentList) {
        this.departmentList = departmentList;
    }

    //判断list中还有没有下一个元素
    @Override
    public boolean hasNext() {
        if (index >= departmentList.size() - 1) {
            return false;
        } else {
            index += 1;
            return true;
        }
    }

    @Override
    public Object next() {
        return departmentList.get(index);
    }

    //空实现
    public void remove() {

    }
}

College :一个统一的聚合接口,将客户端和具体聚合解耦

public interface College {

    public String getName();

    //增加系的方法
    public void addDepartment(String name, String desc);

    //返回一个迭代器,遍历
    public Iterator createIterator();
}

具体的聚合,持有对象集合,并提供一个方法,返回一个迭代器可以正确遍历集合

public class ComputerCollege implements College {

    Department[] departments;
    int numOfDepartment = 0; //保存当前数组的对象个数

    public ComputerCollege() {
        departments = new Department[5];
        addDepartment("Java专业", "Java专业");
        addDepartment("PHP专业", "PHP专业");
        addDepartment("大数据专业", "大数据专业");
    }

    @Override
    public String getName() {
        return "计算机学院";
    }

    @Override
    public void addDepartment(String name, String desc) {
        Department department = new Department(name, desc);
        departments[numOfDepartment] = department;
        numOfDepartment += 1;
    }

    @Override
    public Iterator createIterator() {
        return new ComputerCollegeIterator(departments);
    }
}
public class OutPutImpl {

    //学院集合
    List<College> collegeList;

    public OutPutImpl(List<College> collegeList) {
        this.collegeList = collegeList;
    }

    //遍历所有学院,然后调用printDepartment 输出各个学院的系
    public void printCollege() {
        //从collegeList取出所有学院,Java中List已经实现Iterator
        Iterator<College> iterator = collegeList.iterator();

        while (iterator.hasNext()) {
            //取出一个学院
            College college = iterator.next();
            System.out.println("===" + college.getName() + "===");
            printDepartment(college.createIterator());//得到对应迭代器
        }
    }

    //输出学院输出系
    public void printDepartment(Iterator iterator) {
        while (iterator.hasNext()) {
            Department d = (Department) iterator.next();
            System.out.println(d.getName());
        }
    }
}

迭代器模式在JDK-ArrayList集合应用的源码分析

ArrayList应用Demo
在这里插入图片描述
点击ArrayList实现List接口
在这里插入图片描述
点击进入List接口,则可知,List声明了一个Iterator方法。
在这里插入图片描述
在ArrayList中重写了iterator()方法,并返回了一个Iterator对象。
在这里插入图片描述
Itr类就是实现了Iterator接口的一个子类,返回一个Iterator接口的子类,这个子类充当了具体的迭代器类,管理迭代
在这里插入图片描述
Itr是实现Iterator接口的内部类
在这里插入图片描述

ArrayList源码类图分析

在这里插入图片描述

迭代器模式的注意事项和细节

优点

  1. 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
  2. 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
  3. 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一职责原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
  4. 当要展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式。

缺点
每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类

生信分析进阶14 - 从GTF文件提取基因、转录本、TSS和TSE 从GTF文件提取基因、转录本、TSS和TSE 阅读详情

相关推荐

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4895

图解设计模式之Iterator模式————一个一个遍历

1、Iterator模式    使用java语言显示数组arr中的元素时,我们可以使用下面这样的for循环语句来遍历数组。for (int i = 0,l = arr.length; i &lt; l; i++){ System.out.println(arr[i]); }         请注意这段代码中的循环变量i。该变量的初始值是0,然后会递增为1,2,3,。。。,程...

Chenjay‘s Blog 1015

车规级非易失存储选型指南:从AEC-Q100到ISO 26262的可靠性设计

非易失存储器是电子系统中负责长期保存关键数据与代码的核心组件,其可靠性直接决定了系统的长期稳定运行能力。在汽车电子领域,这一要求被提升到了极致,必须满足严苛的车规级标准。从原理上看,存储器的数据保持能力、擦写寿命等关键参数在高温、振动等恶劣环境下会急剧衰减,因此需要专门的设计与验证。其技术价值在于保障车辆全生命周期的功能安全与数据完整性,避免因存储失效导致的安全隐患或频繁维护。应用场景涵盖从发动机控制单元、自动驾驶域控制器到智能座舱的各类电子控制单元。本文聚焦于车规级非易失存储的选型,深入解析AEC-Q10

weixin_30938149的博客 458

设计模式第16讲——迭代器模式(Iterator)

迭代器模式是一种行为型设计模式。一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图 5.1 Student——学生实体类5.2 StudentIterator——抽象迭代器(Iterator)5.3 StudentListIterator——具体迭代器(Concrete iterator)5.4 StudentAggregate——抽象聚合器(Aggregate)5.5 ClassList

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

零成本接入Gemini Pro:GCP+NewAPI+OpenCode全栈方案

AI编程助手在现代开发流程中扮演着越来越重要的角色,其核心原理是通过大语言模型理解开发者意图并生成代码。以Gemini Pro为代表的顶级模型虽然能力出众,但成本控制和接入复杂度成为主要痛点。通过Google Cloud Platform的免费额度与开源工具链组合,开发者可以构建零成本的AI辅助开发环境。该方案采用Vertex AI作为基础模型服务,通过New API实现协议转换,最终与OpenCode终端工具深度集成。这种架构特别适合需要长期稳定使用AI编程助手的开发者,既能享受Gemini Pro的百万

weixin_29051245的博客 429

大数据在电力行业的应用案例解析 -【电力技术】(十)电力数字化运营与大数据精准服务体系建设

电力数字化运营,是大数据在电力行业从技术场景走向业务价值的最终落点。它以数据为纽带,将用户、设备、服务、收益、风险全部纳入统一闭环,实现从 “管好电” 向 “运营好能源资产” 升级。在新型电力系统与市场化改革双重驱动下,谁能用好数据、建好闭环、做好运营,谁就能在服务、成本、效益、安全上建立长期优势。

getusushu的博客 69

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

迭代器模式是一种设计模式,它用于提供一种方法来访问一个容器对象中的各个元素,而又不暴露该对象的内部表示。在迭代器模式中,我们定义一个抽象的迭代器类,它包含两个方法:一个是hasNext()方法,用于判断是否还有下一个元素;另一个是next()方法,用于获取下一个元素。然后,每个容器类都实现自己的迭代器类,以访问容器中的元素。

miaoyl的博客 2496

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3038

迭代器模式

定义 迭代器(Iterator)模式的定义:提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。 在学习Java集合的时候,我们要访问容器内的对象,就要知道容器的结构,如ArrayList要用get来获取对象,而set只能用迭代器或for each循环。所以,当容器类型很多时,使用是不方便的,我们需要一种接口,这个接口可以遍历容器的对象,而...

Endeavor_G的博客 1993

qiankun(微前端) - 解决Element组件库部分样式失效,主应用和子应用分别使用element-ui和element-plus,前端微应用qiankun样式无效污染隔离子应用样式影响其他应用

乾坤qiankun,微前端,vue,qiankun主应用使用vue2+elementui子应用使用vue3+element plus样式失效,子应用样式影响其他应用样式问题,qiankun项目与子应用样式混乱问题,彻底搞定样式污染,前端微应用qiankun样式污染,组件样式部分失效怎么办,互相影响,qiankun子应用中使用element-plus样式失效问题,组件库样式污染混乱,子应用样式影响到主应用怎么办,微前端qiankun子应用样式影响其他应用样式,样式冲突,Vue+qiankun框架样式混乱问题的

✅ 精选推荐文章 8875

Ceph入门到精通-存储桶通知

这 通知还可以根据前缀的匹配项过滤掉事件,并且 (1) 键的后缀,(2) 附加到对象的元数据属性, 或 (3) 对象标签。在此模式下,操作仅在以下之后确认(确认) 通知将发送到主题的已配置终端节点。这意味着 通知的往返时间(发送 通知主题的终端节点以及接收 确认)被添加到操作本身的延迟中。要更新主题,请使用用于创建主题的相同命令(但在 更新时,使用现有主题的名称和不同的终端节点值)。端口:对于未加密的连接,默认为 5672,对于未加密的连接,默认为 5671 SSL 加密连接。(默认情况下,这是“假的”。

隔壁老瓦的专栏 1131

设计模式之【迭代器模式】,对集合访问的统一

迭代器模式(Iterator Pattern)又称为游标模式(Cursor Pattern),它提供一种顺序访问集合/容器对象元素的方法,而又无需暴露集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构,属于行为型模式。迭代器模式的本质是抽离集合对象迭代行为到迭代器中,提供一致访问接口。

秃了也弱了 1537

Xinference新手指南(一个命令直接安装成功)

对于新手,必须得学会使用docker部署,这是基本功!这里就不过多去介绍了,如果评论要出教程的话,以后再出了。

Ven%的博客 818

设计模式学习—迭代器模式(Iterator Design Pattern)

设计模式学习之迭代器模式,一种行为性设计模式

闲鱼的博客 477

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

认真学习设计模式之迭代器模式(Iterator Pattern)

# 【1】概述 迭代器模式(Iterator Pattern)是常用的设计模式,属于`行为型`模式。 如果我们的集合元素是用不同的方式实现的,有数组,还有java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。 **UML原理图** ![在这里插入图片描述](https://img-b

小小默:进无止境 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

定义 迭代器模式提供了一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 主要解决:不同的方式来遍历整个整合对象。 何时使用:遍历一个聚合对象。 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。 关键代码:定义接口:hasNext, next。 应用实例...

提莫达达的博客 175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

HeadFirst 设计模式学习笔记9--迭代器模式

本文已搬家至【HeadFirst 设计模式学习笔记】9 迭代器模式

gnuhpc的专栏 3285

学习设计模式《十三》——迭代器模式

 迭代器模式的本质是【控制访问聚合对象中的元素】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1275

设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

目前已经更新的部分资料:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!菜单/**煎饼屋菜单实现*//**

2401_84562251的博客 1058

学习笔记【23种设计模式-第十六节:Iterator Pattern 迭代器模式】

Iterator Pattern 迭代器模式 简述: 迭代器模式是常用的设计模式,属于行为型模式 如果我们的集合元素使用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 迭代器模式,提供一种遍历集合元素的统一接口,用一只的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。 角色 Iterator:迭代器接口,是系统提供的 ConcreteIterator

qq_53273362的博客 141

学习设计模式——迭代器模式

学习设计模式——迭代器模式 文章目录学习设计模式——迭代器模式数组迭代器对象迭代器同步变量迭代器分支循环嵌套无问题 迭代器模式:提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露其内部的表示 数组迭代器 var eachArray = function(arr, fn) { if(Object.prototype.toString.call(arr) !== '[object Arra...

逆水行舟,不进则退 482

尚硅谷设计模式学习(17)---[迭代器模式(Iterator Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 这次的案例就是之前学习组合模式用到的案例==> 但是这次要使用的是迭代器模式 解决问题. 迭代器模式 提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,无需了解集合对象的底层表示,即:不暴露其内部的结构. 适合于集合元素是用不同的方式实现的情况 原理 Iterator : 迭代器接口,API提供的 ...

从零开始的异世界JAVA学习 278

设计模式学习--18.迭代器模式(Iterator Pattern)

package com.designepattern.Iteratorpattern.v2; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; /** * @Author:glx * @Date:2020/12/10 * @Content: */ public class MainDemo...

u010031813的博客 150

设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)(1)

**定义菜单组件*/

2401_84004024的博客 469

java设计模式学习之【迭代器模式】

这篇教程不仅提供了迭代器模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1139
上一篇: SpringCloud学习——系统架构演变、Dubbo和SpringCloud的对比
下一篇: 设计模式学习——观察者模式
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值