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

文章目录

  • 引言
  • 迭代器模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 在Spring框架中的应用
  • 迭代器示例
  • 代码地址

引言

想象一下,你在一个书店里浏览各种书籍。你可能会从头到尾查看每一本书,或者可能跳过一些不感兴趣的部分。在这个过程中,你实际上是在迭代遍历书籍的集合,而且你可以按照自己的方式来进行。在软件开发中,我们经常需要遍历各种集合对象(如列表、树、图等)。迭代器模式提供了一种标准的方法来遍历这些集合,无需暴露集合的内部表示。

迭代器模式简介

定义与用途

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象中各个元素,而又无需暴露该对象的内部表示。迭代器模式把迭代的责任交给迭代器对象,而不是聚合对象,这不仅简化了聚合类,也提供了一种统一的接口来遍历不同类型的聚合结构。

实现方式

实现迭代器模式通常涉及以下几个关键组件:

  • 迭代器接口(Iterator):定义了访问和遍历元素的接口。
  • 具体迭代器(Concrete Iterator):实现迭代器接口,并负责管理当前遍历的位置。
  • 聚合接口(Aggregate):定义了创建相应迭代器对象的接口。
  • 具体聚合(Concrete Aggregate):实现创建相应迭代器的接口,该迭代器能够遍历聚合对象。

使用场景

迭代器模式适用于以下场景:

  • 当需要为聚合对象提供多种遍历方式时。
  • 当需要为遍历不同的聚合结构提供一个统一的接口时。
  • 当你希望封装遍历算法或聚合对象的内部结构时。

例如:
数据库记录的遍历: 查询可能返回大量记录,迭代器模式可以用于逐个处理这些记录。
播放列表: 迭代器模式允许用户顺序地或按某种顺序(如随机、按评分、按日期)遍历播放列表中的所有项目,而无需了解列表的内部结构。

优势与劣势

  • 优势
    支持多种遍历: 可以定义多个遍历同一聚合对象的方式。
    简化聚合类: 将遍历代码抽象到迭代器中,简化了聚合类的定义。
    统一接口: 为不同类型的聚合结构提供了一个统一的遍历接口。
  • 劣势
    增加了系统的复杂性: 需要额外定义迭代器类。

在Spring框架中的应用

Spring框架本身并未直接提及迭代器模式,但是Java集合框架的迭代器在Spring中得到了广泛使用。Spring经常处理各种集合类型,如List、Set和Map,它们都支持Java的Iterator接口。此外,Spring的许多功能(例如处理配置文件中的集合)都依赖于迭代器来遍历集合元素。

迭代器示例

在这里插入图片描述
步骤 1:创建接口
首先定义了两个接口:Iterator 和 Container。

public interface Iterator {public boolean hasNext();public Object next();
}

Iterator 接口包含两个方法:hasNext 用于检查集合中是否还有元素,next 用于获取集合中的下一个元素。

Container.java

public interface Container {public Iterator getIterator();
}

Container 接口包含一个方法:getIterator,用于返回一个新的迭代器对象。

步骤 2:创建实现 Container 接口的具体类
定义了一个具体的类 NameRepository,它实现了 Container 接口。这个类包含一个内部类 NameIterator,它实现了 Iterator 接口。

public class NameRepository implements Container {public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};@Overridepublic Iterator getIterator() {return new NameIterator();}private class NameIterator implements Iterator {int index;@Overridepublic boolean hasNext() {return index < names.length;}@Overridepublic Object next() {if(this.hasNext()){return names[index++];}return null;}		}
}

NameRepository 是一个包含一系列名字的集合。NameIterator 是一个迭代器,用于遍历这些名字。

步骤 3:使用 NameRepository 获取迭代器并打印名字

public class IteratorPatternDemo {public static void main(String[] args) {NameRepository namesRepository = new NameRepository();for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){String name = (String)iter.next();System.out.println("Name : " + name);} 	}
}

在这里插入图片描述

在这个演示类中,我们创建了 NameRepository 的一个实例,并通过其获取一个迭代器。然后我们使用这个迭代器来遍历并打印出所有的名字。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

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

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

相关文章

计算机操作系统(OS)——P1操作系统概述

1、操作系统的概念(定义) 1.1、什么是操作系统 __操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;__是指控制和管理整个计算机系统的__硬件和软件__资源&#xff0c;并合理的组织调度计算机的工作和资源的分配&#xff1b;以__提供给用户和其它…

都2023年了还不了解?使用FileZilla搭建信息文件服务器(Windows7)

目录 前言&#xff1a; 一.FileZilla介绍 1.FileZilla介绍 2.FileZilla的优点以及不足 优点 不足 3.FileZilla应用场景 4.FileZilla的主要功能&#xff1a; 二.Windows7搭建FileZilla服务器&#xff0c;并且在本地访问 1.下载 2.FileZIlla安装 服务端安装 新建组 …

基于鸿蒙OS开发一个前端应用

创建JS工程&#xff1a;做鸿蒙应用开发到底学习些啥&#xff1f; 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择HarmonyOS模板库&#xff0c…

uniapp开发移动端遇到的问题记录

1. 键盘弹起时页面整体上移问题 很常见但我解决过程中遇到了很多问题 我的键盘没有遮盖到输入框&#xff0c;但手机键盘弹起后&#xff0c;form部分会整体上移一点&#xff0c;并且底部的操作也会弹到键盘上方 网上写得很复杂&#xff0c;什么动态赋值高度balabala。看到有一…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

基于Java+SpringBoot+vue实现图书借阅管理系统

基于JavaSpringBootvue实现图书借阅和销售商城一体化系统 &#x1f345; 作者主页 程序设计 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringBootvue实现图书借阅和销售商城一体化…

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【Web网站测试流程及方法】给你一个网站,你如何来做自动化测试的?

我想大多数开始进行web端页面测试的人&#xff0c;一开始会的都是在页面上点点点&#xff0c;然后一看到页面上有什么图片失效啊&#xff0c;页面遮挡就觉得是找到了大bug&#xff1b;一开始我也是这样&#xff0c;尽管我很谨慎&#xff0c;很仔细&#xff0c;把页面上的每一个…

hosts文件、DNS、删除浏览器域名安全策略、浏览器代理

文章目录 1. hosts文件2. DNS3. 删除浏览器域名安全策略4. 浏览器代理服务器 1. hosts文件 位置 C:\Windows\System32\drivers\etc\hosts 没有后缀名 内容 ip 一个空格 域名 定义 hosts就是系统的一个配置文件&#xff0c;主要配置ip和域名的映射关系&#xff0c;相当于是本地…

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动&#xff08;建议&#xff09; sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…

pyomo使用cplex求解,进行冲突校验

文章目录 求解参数设置模型保存模型冲突校验pyomo冲突校验cplex冲突校验docplex冲突校验 CPLEX 安装包下载 pyomo使用 cplex求解&#xff0c;进行冲突校验 求解参数设置 options {"timelimit" : 60*60, # 设置求解时间&#xff0c;超过设置时间&#xff0c;求解停…

EfficientNet

时间&#xff1a;2019 EfficicentNet网络简介 EfficientNet:Rethinking Model Scaling for Convolutional Neural Networkshttps://arxiv.org/abs/1905.11946,这篇论文是Google在2019年发表的文章。 EfficientNet这篇论文&#xff0c;作者同时关于输入分辨率&#xff0c;网络…

windows进行udp端口转发,解决项目中服务器收不到组播数据的问题

说明 windows7的netsh interface portproxy命令只支持tcp端口转发 如果要进行udp端口转发可以使用sokit 运行sokit 端口转发&#xff08;以为tcp作为讲解&#xff0c;udp类似&#xff09; 选择转发器 输入监听地址&#xff08;SRC地址&#xff09;和端口 输入转发地址&am…

基于ssm建筑装修图纸管理平台论文

建筑装修图纸管理平台 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了建筑装修图纸管理平台的开发全过程。通过分析高校学生综合素质评价管理方面的不足&#xff0c;创建了一个计算机管理建筑装修图纸管理平台…

Python新手上路:“用Python和Pygame创造你的流星雨”

文章目录 一、前言二、下载安装过程1.官网下载安装包2.安装python过程第一步第二步第三步第四步第五步安装完成 3.简单测试Python3.1 检查 Python 版本号3.2 打开 Python 解释器3.3 输入你的第一个代码3.4 运行 Python 脚本 4.安装Pygame4.1 cmd命令安装Pygame4.2 pip升级4.3 安…

Radar System Pro - Plug Play Solution

Radar System Pro是一款功能多样且可定制的资源,旨在通过功能齐全且易于使用的雷达系统增强您的Unity项目。无论您是在开发第一人称射击游戏、策略游戏还是太空探索模拟器,我们的雷达系统都将为您提供所需的工具,以创建引人入胜且身临其境的体验。 雷达系统是一个模块化资产…

信息安全概论快速复习(期末急救)

文章目录 1、DES中的S-盒输入输出问题 &#xff08;不需要记住S-盒&#xff09;2、Kerberos认证系统3、简答题&#xff08;三题每题8分&#xff09;&#xff1a;课后习题第一章、第三章、第四章第一章&#xff1a;重点关注安全模型内容&#xff0c;有几种&#xff0c;有几个分级…

UDP单播

CMakeLists.txt文件中添加如下行&#xff1a; link_libraries(ws2_32) 1.发送端 #include <iostream> #include <winsock2.h> #include <cstdio>#pragma comment(lib, "Ws2_32.lib") // Link with ws2_32.libint main() {1.Initialize winsock…

平衡二叉树(AVL树)原理

1、平衡二叉树(AVL树) 平衡二叉树也称之为AVL树&#xff0c;是一个具有以下特征的二叉搜索树&#xff1a; 1、左子树和右子树高度差不会大于1 2、左右两颗子树都满足第一个条件。 1.1、满足条件的AVL树 以下树&#xff0c;左边的高度为3&#xff0c;右边的高度为2&#xf…

Azure 学习总结

文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性3.1 Service Bus 基…