【设计模式】我终于读懂了迭代器模式。。。

news2024/11/14 13:38:18

看一个具体的需求

编写程序展示一个学校院系结构:需求是这样
要在一个页面中展示出学校的院系组成,
一个学校有多个学院,
一个学院有多个系。

如图:

在这里插入图片描述

传统的设计方案(类图)

在这里插入图片描述

传统的方式的问题分析

  1. 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的

  2. 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,不能很好实现的遍历的操作

  3. 解决方案:=> 迭代器模式

迭代器模式基本介绍

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

迭代器模式的原理类图

在这里插入图片描述

对原理类图的说明-即(迭代器模式的角色及职责)

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

迭代器模式应用实例

编写程序展示一个学校院系结构:需求是这样,
要在一个页面中展示出学校的院系组成,
一个学校有多个学院,
一个学院有多个系。

在这里插入图片描述

College类,学院超类

在这里插入图片描述

ComputerCollege类,计算机学院

在这里插入图片描述

里面的专业(Department)是以数组方式存储的

Department类

在这里插入图片描述

InfoCollege类,信息工程学院

在这里插入图片描述
这里面的专业(Department)是以列表方式存储的

ComputerCollegeIterator类,计算机学院具体迭代类,需要实现Iterator接口

在这里插入图片描述

InfoColleageIterator类,信息工程学院具体迭代类,需要实现Iterator接口

在这里插入图片描述

OutPutImpl类,统一打印信息

在这里插入图片描述

Client类,客户端类

在这里插入图片描述

运行结果

在这里插入图片描述

老规矩,debug看看

在这里插入图片描述

这里构建了一个含有计算机学院和信息工程学院的list传入到OutPutImpl的构造函数中去

在这里插入图片描述
可以看到outPutImpl被实例之后的对象含有一个列表成员变量

进入printCollege方法

在这里插入图片描述

这里调用的是list里面的Iterator拿出每个学院出来,并且打印名称

在这里插入图片描述

college.createIterator()方法

在这里插入图片描述
在这里插入图片描述

这里返回了一个具体的迭代器

在这里插入图片描述
在这里插入图片描述

再回到printDepartment方法

在这里插入图片描述

这里的迭代器是一个计算机学院迭代器

在这里插入图片描述

所以他就会走我们自己的实现

在这里插入图片描述

接着拿到专业

在这里插入图片描述

输出专业名称

在这里插入图片描述

信息工程学院亦是如此

这样OutPutImpl这个类其实并不知道具体的迭代器是什么,就将我们的内部细节给隐藏起来了

迭代器模式在JDK中的源码分析

JDK 的 ArrayList 集合中就使用了迭代器模式

代码分析

ArrayList类

在这里插入图片描述

ArrayList的iterator方法

在这里插入图片描述

返回了一个Itr类

他是ArrayList里面的实现了iterator的内部类

在这里插入图片描述

他存在的成员变量elementData存储数据

在这里插入图片描述

然后我们看看linkedlist

在这里插入图片描述

他的父类AbstractSequentialList有一个iterator方法

在这里插入图片描述

实际调用的是AbstractSequentialList的父类AbstractList里面的listIterator方法

在这里插入图片描述

实际返回的是AbstractList内部类ListItr

在这里插入图片描述

对类图的角色分析和说明

在这里插入图片描述

  1. 内部类 Itr 充当具体实现迭代器 Iterator 的类, 作为 ArrayList 内部类,类似ConcreteIterator
  2. List 就是充当了聚合接口,含有一个 iterator() 方法,返回一个迭代器对象,类似Aggregate
  3. ArrayList 是实现聚合接口 List 的子类,实现了 iterator(),类似ConcreteAggreage
  4. Iterator 接口系统提供

迭代器模式解决了 不同集合(ArrayList ,LinkedList) 统一遍历问题

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

优点

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

缺点

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

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

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

相关文章

深度学习(23):SmoothL1Loss损失函数

0. 基本介绍 SmoothL1Loss是一种常用的损失函数,通常用于回归任务中,其相对于均方差(MSE)损失函数的优势在于对异常值(如过大或过小的离群点)的惩罚更小,从而使模型更加健壮。 SmoothL1Loss的公式为: l o s s ( x , y ) { 0.5 …

机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

eureka自我保护模式详解(全网最全)

1. 什么叫自我保护模式? 当微服务客户端启动后,会把自身信息注册到Eureka注册中心,以供其他微服务进行调用。一般情况下,当某个服务不可用时(一段时间内没有检测到心跳或者连接超时等),那么Eure…

spring3:更简单的读取和存入对象

目录 1.存储 Bean 对象 1.1 前置⼯作:配置扫描路径(重要) 1.2 添加注解存储 Bean 对象 1.2.1.Controller[控制器] 1.2.2 Service[服务] 1.2.3 repoistory[仓库] 1.2.4 Configuration[配置] 1.2.5 Component[组件] 1.3为什么要这么多类…

Spring 创建和使用

文章目录 什么是 Bean ?1. 创建 Spring 项目1.创建一个 Maven 项目2. 添加 Spring 依赖1.配置 Maven 国内源2.添加 Maven 依赖 3.添加启动项 2.存储Bean对象1.创建 Bean2.注册 Bean3.获取并使用 Bean 对象1. 得到 Spring 对象常见方式有两种: 2. 获取 Bean 对象Bean 的三种获取…

SpringMVC中使用LocalDateTime、LocalDate等参数作为入参数据转换问题

1、接收GET请求方式及POST请求表单方式时间类型传参,需要自定义参数转换器或者使用ControllerAdvice配合initBind,不设置的话表单方式会报以下错误: 这种情况要和时间作为Json字符串时区别对待,因为前端json转后端pojo底层使用的是…

什么是Auto GPT-4? OpenAI 最新语言模型概览

动动发财的小手,点个赞吧! 人工智能正在快速发展,近年来最令人兴奋的发展之一是创建可以生成类似人类文本的语言模型。领先的人工智能研究机构 OpenAI 最近发布了其最新的语言模型 Auto GPT-4。 在什么是 Auto GPT-4? OpenAI 最新…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…

AtCoder Beginner Contest 300(D-G)

D - AABCC (atcoder.jp) (1)题目大意 给你个数N,问你不超过N的三个质数abc组成的数有多少个。 (2)解题思路 考虑到枚举的数不会特别多,因此预处理出1e6的质因子,暴力枚举即可。 (3&a…

在体育新闻文本中提取关键词可以使用什么技术

在体育新闻文本中提取关键词可以使用以下技术: 1. 领域词典: 通过构建体育领域的词汇表,将其中的词语作为关键词,可以较好地提取体育新闻中的关键词。 就当下的研究情况,国内外有哪些体育领域的词汇表http://t.csdn…

Reactive Streams介绍与应用分析

目录 一、Reactive Streams基本知识 (一)基本介绍 (二)反应式流的特点 基本特性1:事件驱动&变化传递 基本特性2:数据流 基本特性3:声明式 高级特性1:流量控制(回压) 高级特性2:异步边界 &…

ALBEF:基于动量蒸馏的视觉语言表示学习

Align before Fuse:Vision and Language Representation Learning with Momentum Distillation ALBEF:基于动量蒸馏的视觉语言表示学习 摘要 大规模的视觉和语言表征学习在各种视觉-语言任务上显示出有希望的改进。大多数现有的方法采用了基于Transform…

【平衡二叉搜索树(AVL)-- 旋转】

目录: 前言1、二叉搜索树的插入2、AVL树的旋转(1)右单旋(LL)(2)左单旋(RR)(3)右左双旋(LR)(4)左右…

第18章 项目风险管理

文章目录 18.1.2 风险的分类 54318.1.3 风险的性质 544项目风险管理6个过程(风险管理、识别风险、实施定性风险分析、实施定量风险分析、规划风险应对、控制风险)组织和干系人的风险态度影响因素18.3.3 规划风险管理的输出 550风险识别的原则18.4.2 识别…

vim编辑文件

目录 一、vi和vim (1)介绍 (2)相同点 (3)不同点 二、使用vim打开文件 三、使用vim编辑文件 (1)vim的四个模式 (2)命令模式下的编辑命令 删除 复制 …

树莓派4:跑通Tensorflow的Sequential模型用于图片分类

重要提示:由于树莓派相对孱弱的性能,直接在其上训练模型可能花(lang4)费非常长的时间。本文仅作为示例性的可行性参考,请酌情考虑实验平台。 著名的Tensorflow框架也可以运行在树莓派上。理论还没吃透,但使…

【量化交易笔记】5.SMA,EMA 和WMA区别

股票中的SMA,EMA和WMA是常用的技术分析指标。这些指标基于历史股价计算得出,可以帮助投资者了解股票的趋势,为决策提供依据。虽然它们都是平均值算法,但它们之间还是有一些区别的。 SMA 简单移动平均线(Simple Moving…

参与辅助服务的用户侧储能优化配置及经济分析(matlab代码)

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现《参与辅助服务的用户侧储能优化配置及经济分析》,首先, 建立了用户侧储能的全生命周期成本和考虑辅助服务的收益模型;其次,在两部…

一文读懂UML用例图

一、概述 用例是描述系统需求的一种手段,即系统应该做什么。用例图由参与者、用例和主题组成。每个用例的主题都代表了一个用例所适用的系统。用户和任何其他可以与主体交互的系统都被表示为行动者。 用例是一种行为规范。用例的实例指的是紧急行为的发生符合相应…

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

🏜哈喽,大家好,我是小浪。前段时间羊了个羊火遍了大江南北,大家是否都通过第二关了呢?哈哈,没关系,既然通不过,那咋们不如自己来做一个这样的羊了个羊的仿写页面,学会了赶…