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

1 问题引出

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

传统方式实现 

 

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

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

2 基本介绍

  1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式

  2. 如果我们的集合元素是用不同的方式实现的,有数组,还有 java 的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。

  3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。

3 原理结构图

3.1 类图

3.2 说明

  1. Iterator : 迭代器接口,是系统提供,含义 hasNext, next, remove

  2. ConcreteIterator : 具体的迭代器类,管理迭代

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

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

  5. Client :客户端, 通过 Iterator 和 Aggregate 依赖子类

4 应用实例

4.1 类图

4.2 代码实现

Client

public class Client {
​public static void main(String[] args) {//  创建学院List<College> collegeList = new ArrayList<College>();
​ComputerCollege computerCollege = new ComputerCollege();InfoCollege infoCollege = new InfoCollege();
​collegeList.add(computerCollege);//  collegeList.add(infoCollege);
​OutPutImpl outPutImpl = new OutPutImpl(collegeList);outPutImpl.printCollege();}
​
}

College

public interface College {
​public String getName();
​//  增加系的方法public void addDepartment(String name, String desc);
​//  返回一个迭代器,遍历public Iterator createIterator();
}

ComputerCollege

public class ComputerCollege implements College {
​Department[] departments;int numOfDepartment = 0;//  保存当前数组的对象个数
​public ComputerCollege() {departments = new Department[5];addDepartment("Java 专业", " Java 专业 ");addDepartment("PHP 专业", " PHP 专业 ");addDepartment("大数据专业", " 大数据专业 ");}
​@Overridepublic String getName() {return "计算机学院";}
​@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments[numOfDepartment] = department;numOfDepartment += 1;}
​@Overridepublic Iterator createIterator() {return new ComputerCollegeIterator(departments);}
}

ComputerCollegeIterator

public class ComputerCollegeIterator implements Iterator {
​//  这里我们需要 Department 是以怎样的方式存放=>数组Department[] departments;int position = 0; //  遍历的位置
​public ComputerCollegeIterator(Department[] departments) {this.departments = departments;}
​//  判断是否还有下一个元素@Overridepublic boolean hasNext() {//  TODO Auto-generated method stubif (position >= departments.length || departments[position] == null) {return false;} else {return true;}}
​@Overridepublic Object next() {Department department = departments[position];position += 1;return department;}
​//  删除的方法,默认空实现public void remove() {}
​
}

Department

// 系
public class Department {
​private String name;private String desc;
​public Department(String name, String desc) {super();this.name = name;this.desc = desc;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​public String getDesc() {return desc;}
​public void setDesc(String desc) {this.desc = desc;}
​
}

OutPutImpl

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());}}
}

5 优缺点

5.1 优点

  1. 统一的遍历接口:迭代器模式提供了一致的方法来访问不同的集合类型,简化了客户端代码。
  2. 解耦集合与遍历逻辑:由于集合的遍历逻辑被封装在迭代器中,集合类可以专注于存储和管理数据。客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
  3. 支持多种遍历方式:同一个集合可以支持多种不同的遍历方式,只需添加新的迭代器即可。
  4. 扩展性:增加新的聚合类或迭代器类很方便,符合“开闭原则”。

5.2 缺点

  1. 增加复杂度:每增加一个新的集合类型,就需要增加一个新的迭代器类,这可能会增加系统的类数量。每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类.
  2. 实现成本:对于简单的遍历需求,实现迭代器模式可能会显得过于繁琐和不必要。

6 迭代器模式的应用

  1. Java和.Net:在这些编程环境中,迭代器模式被广泛使用。Java的Iterator接口和.Net中的相似功能都是迭代器模式的实现。
  2. 生成器(Generator):在支持生成器功能的语言中,如JavaScript,生成器可以被视为一种特殊的迭代器,用于控制函数的执行流程。
  3. 遍历不同数据结构:在需要遍历不同数据结构(如数组、树、图)时,迭代器模式提供了统一的解决方案。

7 总结

        迭代器模式是一种强大的设计模式,它使得遍历各种复杂的数据结构变得简单和统一。通过将遍历的逻辑封装在迭代器中,迭代器模式不仅提供了对数据访问的抽象,还允许灵活地添加新的遍历算法而不影响现有的代码。然而,迭代器模式的实现可能会增加系统的复杂性,因此在选择使用该模式时应该权衡其利弊后,再做抉择。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—如何应对双循环RAID5阵列的数据丢失问题?

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由7块硬盘组建的RAID5阵列&#xff0c;存储中还有另外3块盘是raid中掉线的硬盘&#xff08;硬盘掉线了&#xff0c;管理员只是添加一块的新的硬盘做rebuild&#xff0c;并没有将掉线的硬盘拔掉&#xff09;。整个RAID5阵列…

F12控制台输入警告?

信息如下&#xff1a; Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below and …

Type-C接口诱骗取电快充方案

Type-C XSP08Q 快充协议芯片是一种新型电源管理芯片&#xff0c;主要负责控制充电电流和电压等相关参数&#xff0c;从而实现快速充电功能。Type-C XSP08Q快充协议是在Type-C接口基础上&#xff0c;加入了XSP08Q协议芯片的支持&#xff0c;很大程度上提升了充电速度。 正常情况…

css实现卡片右上角的状态

1、成品展示 2、html部分 <div class"itemBox"><div class"status">{{ statusList[item.status] }}</div> </div> 3、css部分 .itemBox {position: relative;overflow: hidden; } .status {height: 25px;line-height: 25px;bac…

【实战教程】用 Next.js 和 shadcn-ui 打造现代博客平台

你是否梦想过拥有一个独特、现代化的个人博客平台&#xff1f;今天&#xff0c;我们将一起动手&#xff0c;使用 Next.js 和 shadcn-ui 来创建一个功能丰富、外观精美的博客系统。无论你是刚接触 Web 开发&#xff0c;还是经验丰富的程序员&#xff0c;这个教程都将带你step by…

Linux网络编程 --- Socket编程

前言 首先看看TCP/IP网络协议和在我们计算机系统层次中的对应关系。 socket的位置 网络通信的本质就是贯穿网络协议层的过程。 局域网数据的封装和解包过程 逻辑上我们认为同层协议之间通信 几乎任何层的协议都会提供一种解包和分用的功能。 几乎任何层的协议&#xff…

FPGA实现SDI视频H265压缩网络推流输出,基于VCU架构,支持12G-SDI 4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的视频图像编解码方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图FPGA开发板视频输入SDI硬件均衡器LMH1219UHD-SDI GT SDI视频解串SMPTE UHD-SDI RX SUBSYSTEM SDI视频解码Video Frame Buffer WriteZynq UltraS…

Apollo Planning模块中的Hybird A*算法

文章目录 流程图OpenSpacePlanner算法与周边模块关系OpenSpacePlanner与PublicRoadPlanner关系Hybird A*流程Hybird A*外部调用入口Hybird A*内部流程 Hybird A*代码逻辑主函数Plan碰撞检测ReedsShepp曲线加速搜索扩展相邻的节点计算节点的代价路径后处理路径分割轨迹平滑&…

android AccessibilityService合法合规增加小红书曝光阅读量(2024-09-02)

免责任声明: 任何可操作性的内容与本人无关,文章内容仅供参考学习&#xff0c;如有侵权损害贵公司利益&#xff0c;请联系作者&#xff0c;会立刻马上进行删除。 一、分析 目前可增加曝光阅读流量渠道入口&#xff08;完成&#xff09; 1. 发现页 打开小红书app选择顶部发现页&…

【网络世界】网络层

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 网络层 &#x1f4c1; IPV4 &#x1f4c2; 什么是IP地址 &#x1f4c2; 网段划分 &#x1f4c2; 特殊IP &#x1f4c2; 内网和公网 &#x1f4c2; IPV4的危机 &#x1f4c1; IP协议格式 &#x1f4c1; 路由 &#x1f…

VSCode+Keil协同开发之Keil Assistant

VSCodeKeil协同开发之Keil Assistant 目录 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤4.1. 部署准备4.2. 安装Keil Assistant插件4.3. 配置Keil Assistant插件 5. Keil Assistant使用6. 总结 大家在单片机开发时…

密码学基础

一、理论知识 科尔霍夫原则 1、对于一个密码学系统&#xff0c;应当仅有密钥是保密的&#xff0c;其余算法和一切参数都应该是公开的 2、并不一定要数学上完全不可破解&#xff0c;只要在现实中不可能破解即可 对称加密 加密解密都使用相同的密钥 非对称加密 1、加密解密…

【iOS】通过第三方库Masonry实现自动布局

目录 前言 约束 添加约束的规则 使用Masonry自动布局 Masonry的常见使用方法 补充 前言 在暑期完成项目时&#xff0c;经常要花很多时间在调试各种控件的位置上&#xff0c;因为每一个控件的位置都需要手动去计算&#xff0c;在遇到循环布局的控件时&#xff0c;还需要设…

【安当产品应用案例100集】014-使用安当TDE实现达梦数据库实例文件的透明加密存储

随着数据安全重要性的不断提升&#xff0c;数据库文件的落盘加密已成为数据保护的一项基本要求。达梦数据库作为一款高性能的国产数据库管理系统&#xff0c;为用户提供了一种高效、安全的数据存储解决方案。本文将详细介绍如何利用安当KSP密钥管理平台及TDE透明加密组件来实现…

OpenAI即将推出自然语音功能

&#x1f989; AI新闻 &#x1f680; OpenAI即将推出自然语音功能 摘要&#xff1a;测试博客testingcatalog揭示OpenAI正在通过逆向工程ChatGPT应用&#xff0c;计划增加更自然的语音朗读功能。未来可能推出8种新语音&#xff0c;具有独特代号&#xff0c;能表达动物叫声等非…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

华为云征文|部署电影收藏管理器 Radarr

华为云征文&#xff5c;部署电影收藏管理器 Radarr 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 性能模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Radarr3.1 Radarr 介绍3.2 Docker 环境搭建3.3 Radarr 部署3.4 Rada…

Django 第十三课 -- Form 组件

Django Form 组件用于对页面进行初始化&#xff0c;生成 HTML 标签&#xff0c;此外还可以对用户提交的数据进行校验&#xff08;显示错误信息&#xff09;。 报错信息显示顺序&#xff1a; 先显示字段属性中的错误信息&#xff0c;然后再显示局部钩子的错误信息。若显示了字…

如何打造高校实验室预约系统?Java SpringBoot助力高效管理,MySQL存储数据,Vue前端展现,四步实现学生轻松预约!

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案

出现cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于YUM仓库源无法找到或无法访问&#xff0c;导致YUM无法正常工作。这种情况常见于CentOS 7系统。解决这个问题需要检查几个方面&#xff0c;如网络连接、DNS设置和YUM仓库源配置。 &#x1f9d1; 博主简介&…