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

2023-05-16

看一个具体的需求

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

如图:

在这里插入图片描述

传统的设计方案(类图)

在这里插入图片描述

传统的方式的问题分析

  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. 每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【设计模式】我终于读懂了迭代器模式。。。 的相关文章

  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 行为型模式-状态模式

    package per mjn pattern state after 环境角色类 public class Context 定义对应状态对象的常量 public final static OpeningState OPENING STAT
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体
  • 设计模式——简单工厂模式

    简单工厂模式定义为 简单工厂模式又称为静态工厂方法模型 它属于类创建型模式 在简单工厂模式中 可以根据参数的不同返回不同类的实例 简单工厂专门定义一个类来负责创建其他类的实例 被创建的实例通常都具有共同的父类 简单工厂模式结构图 简单工厂模
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 设计模式(十)装饰器模式

    装饰器模式是一种非常有用的结构型模式 它允许我们在不改变类的结果的情况下 为类添加新的功能 我们来举例说明一下 首先添加一组形状 它们都实现了形状接口 public interface Shape String getShape class
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 设计模式-享元模式

    一 概念 如果在一个系统中存在多个相同的对象 那么只需要共享一份对象的拷贝 而不必为每一次使用都创建新的对象 目的是提高系统性能 上面的概念乍一听好像单例模式其实不是 单例模式只保存一个对象 但是这里可以有很多个不同对象 但是每个对象只有一
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • 泛型与反射机制在JDBC和Servlet编程中的实践

    写在前面 泛型与反射是java中的两种强大机制 可以很好的提高代码的灵活性和复用性 本篇文章向大家展现在JDBC和Servlet编程场景下反射和泛型技术的实践 通过灵活使用这两种机制打造 高度可复用的JDBC和Servlet代码 1 JDB
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了

随机推荐

  • 0-c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网 xff0c 个人学习笔记 加上了mtianyan标签标记知识点 C语言入门 gt Linux C语言编程基本原理与实践 gt Linux C语言指针与内存 gt Linux C语言结构体 mark https www imo
  • c语言编程求两个整数的最大公约数(两种方法)

    第一种 xff08 for循环 xff09 include lt stdio h gt include lt stdlib h gt int main int i min k a b printf 34 请输入两个整数 n 34 scanf
  • 手机内存LPDDR4X、LPDDR4、LPDDR3的区别 ICMAX告诉你

    现在的智能手机基本人手一部了 xff0c 手机与生活的参与度越来越紧密 xff0c 像学习工作 商务娱乐 支付等 xff0c 基本都能在手机端实现 现在我们买手机时也会更加关注这个手机处理器是什么 xff1f 运行速度快不快这类问题 xff
  • kali安装火狐浏览器

    第一步 xff1a apt get remove iceweasel 第二步 xff1a echo e 34 ndeb http downloads sourceforge net project ubuntuzilla mozilla a
  • 【Kubernetes】The connection to the server <master>:6443 was refused - did you specify the right host ...

    不知道怎么用着用着 xff0c 使用kubectl 时报错 xff0c 错误如下 xff1a root 64 R740 2 2 kubectl get pod The connection to the server 107 105 136
  • 自己动手不求人 - 手工Ghost安装xp、win7系统教程

    由于初级阶段的基本国情 xff0c 很多朋友第一次安装系统大多是用的ghost光盘 xff0c 设置好启动项 xff0c 放进光驱 xff0c 重启后选择安装XX到C盘 xff0c 整个系统就完成了 xff0c 方便快捷 在U盘启动越来越流
  • Security Definitions

    PeopleSoft security is designed around three definition types Permission Lists A set of access rights to application obj
  • 【转】成为Java顶尖程序员 ,看这10本书就够了

    学习的最好途径就是看书 xff0c 这是我自己学习并且小有了一定的积累之后的第一体会 个人认为看书有两点好处 xff1a 1 能出版出来的书一定是经过反复的思考 雕琢和审核的 xff0c 因此从专业性的角度来说 xff0c 一本好书的价值远
  • 【设计模式】我终于读懂了访问者模式。。。

    x1f330 测评系统的需求 将观众分为男人和女人 xff0c 对歌手进行测评 xff0c 当看完某个歌手表演后 xff0c 得到他们对该歌手不同的评价 评价 有不同的种类 xff0c 比如 成功 失败 等 传统方案 x1f331 传统方式
  • MVVM(微软的WPF基础)-MVC(常用模型/设计)-WPF(微软.NETFramework3.0

    为什么80 的码农都做不了架构师 xff1f gt gt gt 最近看 好多人说IOS MVC 过时了 要用MVVM 什么什么的 xff0c 感觉 很新奇 xff0c 就去搜了一下 xff0c 发现原来所谓的MVVM就是 之前微软在10年左
  • prometheus mysql_prometheus监控多个MySQL实例

    之前文章介绍了prometheus grafana exporter的安装以及基本使用 xff0c 在添加mysql监控节点的部分 xff0c 使用了分离部署 43 环境变量的方式 xff0c 如下所示 xff1a 添加MySQL监控 添加
  • NSIS:使用nsWindows.nsh头文件调整窗体大小

    原文 NSIS xff1a 使用nsWindows nsh头文件调整窗体大小 此方法只能简单实现调整窗体大小 xff0c 但不完美 xff0c 调整后窗体上其他的控件都需要调整大小或位置 xff0c 比较麻烦 xff0c 轻狂不建议使用呵
  • iOS 强大第三方资源库

    Github用法 git recipesGit recipes in Chinese 高质量的Git中文教程 lark怎样在Github上面贡献代码 my git有关 git 的学习资料 gitignore非常赞 有用的 gitignore
  • SpringBoot文件上传异常之提示The temporary upload location xxx is not valid

    原文 一灰灰Blog之Spring系列教程文件上传异常原理分析 SpringBoot搭建的应用 xff0c 一直工作得好好的 xff0c 突然发现上传文件失败 xff0c 提示org springframework web multipar
  • 彻底搞懂Object和Function的关系

    Object和Function的关系其实属于原型链的知识范畴 xff0c 如果对于原型链 原型继承还不熟悉的话 xff0c 可以戳这边o xffe3 xffe3 o Object Function和其它对象的关系可以归纳为下面四点 xff1
  • 前后端分离中的无痛刷新token机制

    今天我们来说一说前后端分离中的无痛刷新token机制 xff0c 在手机app中应该经常用到 xff0c 大家都知道在前后端是以token的形式交互 xff0c 既然是token xff0c 那么肯定有它的过期时间 xff0c 没有一个to
  • 理解并配置:IPv6的静态路由与默认路由

    不论是IPv4或者是IPv6的网络环境都完整的支持静态路由 xff0c 静态路由是指由网络管理员手工配置的路由信息 当网络的拓扑结构或链路的状态发生变化时 xff0c 网络管理员需要手工去修改路由表中相关的静态路由信息 静态路由信息在缺省情
  • SQL删除外键约束

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 使用如下SQL语句查询出表中外键约束名称 xff1a span style color 008080 1 span span style color 0000ff sele
  • Windows域控服务器查询命令

    根据Windows版本不同 xff0c 命令有所不同 查本机用户表 net user 查本机管理员 net localhroup administrators 查域管理用户 net group 34 domain dadmins 34 do
  • 【设计模式】我终于读懂了迭代器模式。。。

    看一个具体的需求 编写程序展示一个学校院系结构 xff1a 需求是这样 要在一个页面中展示出学校的院系组成 xff0c 一个学校有多个学院 xff0c 一个学院有多个系 如图 xff1a 传统的设计方案 类图 传统的方式的问题分析 将学院看