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

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(使用前将#替换为@)

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

  • c语言实现面向对象编程(const * ,* const)

    c语言实现面向对象编程 面向对象思想 封装 继承 多态 代码实现 函数签名及返回值的约定 const 重载 参考了onlyshi的博客代码 orz传送门 参考了嵌入式实践一些代码 这里就不加了 面向对象思想 面向对象编程 OOP 并不是一种
  • Java复习-25-单例设计模式

    单例设计模式 目的 使用场景 在实际开发下 会存在一种情况 某一种类在程序的整个生命周期中 只需要实例化一次就足够了 例如 系统数据类 由于操作系统只有一个 因此在程序初始化时该类只需要实例化一次 之后的系统数据更改都是在这一个实例化对象中
  • 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 Java实际应用举例 以ASM技术为例 4 1 被访问对象 ClassReader 4 2 Visitor ClassVisitor 4 3 具体visitor
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

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

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 设计模式之享元模式

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • 设计模式-享元模式

    一 概念 如果在一个系统中存在多个相同的对象 那么只需要共享一份对象的拷贝 而不必为每一次使用都创建新的对象 目的是提高系统性能 上面的概念乍一听好像单例模式其实不是 单例模式只保存一个对象 但是这里可以有很多个不同对象 但是每个对象只有一
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 系列一、 单例设计模式

    一 单例设计模式 1 1 概述 单例模式 Singleton Pattern 是Java中最简单的设计模式之一 这种类型的设计模式属于创建者模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 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 传统的设计方案 类图 传统的方式的问题分析 将学院看