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://www.hqwc.cn/news/305523.html

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

相关文章

亚马逊多店铺怎么解决后台绑卡付店铺月租?

一、如何解决亚马逊后台绑卡付店铺月租费的问题呢&#xff1f; 在亚马逊开很多店的玩法&#xff0c;是如何有那么多的实体卡去绑定后台扣月租的呢&#xff1f; 做日亚、美亚店群模式的这种玩法是如何解决亚马逊后台交月租费的问题呢&#xff1f; 其实很简单&#xff0c;他们…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

AI时代下,如何看待“算法利维坦”?

ChatGPT的浪潮从2022年袭来后&#xff0c;至今热度不减&#xff0c;呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术…AI真的已经走进了生活的方方面面&#xff0c;我们仿佛已经进入了AI时代&#xff0c;势不可挡。人工智能水平如此之高&#xff0c;不禁感慨…

仪表盘、数据分析新增分享功能及应用服务下新增服务实例菜单

近期&#xff0c;博睿数据根据一体化智能可观测平台 Bonree ONE 产品本身&#xff0c;以及用户反馈进行持续的更新和优化。以下为 Bonree ONE 产品功能更新报告第03期内容&#xff0c;更多探索&#xff0c;未完待续。 本次迭代的更新集中在平台的仪表盘、数据分析新增分享功能&…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

【CSS】基础知识梳理和总结

1. 前言 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;用来为HTML文档添加样式的计算机语言。HTML中加载样式的方法有三种&#xff1a; 通过<link>标签加载外部样式表&#xff08;External Style Sheet&#xff09;&#xff0c…

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

1.3MySQL中的自连接

自己的表和自己连接&#xff0c;核心&#xff1a;一张表拆为两张一样的表。 语法&#xff1a;select 字段列表 from 表 [as] 表别名1,表 [as] 表别名2 where 条件...; 关于怎样把一个表拆分成一个表&#xff0c;只要给它们分别取别名就行 categoryidpidcategoryname21信息…

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

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

低代码,前端工程化项目的未来

一、前言 在软工圣经《人月神话》一书中&#xff0c;作者Brooks指出了软件发展的一个僵局&#xff1a;在落后的项目中增加人手&#xff0c;只会使进度更加落后。 为了更快完成项目&#xff0c;开发团队会发展的极其庞大&#xff0c;以致于所有的时间都花费在沟通和变更决策上&a…

网络PDF文件转图片并通过nginx代理预览

一、网络PDF转图片 /*** param pdfOss 原文件* param desFilePath 生成图片的路径* param desFileName 生成图片的名称&#xff08;多页文档时会变成&#xff1a;名称下划线从1开始的数字&#xff09;* param imageType 图片类型* return*/public static Pair<Boole…

【Linux驱动】Linux中断(一)—— 设备树中断节点

裸机使用中断需要通过寄存器手动配置&#xff0c;但有了 Linux 系统后&#xff0c;Linux内核提供了完善的中断框架&#xff0c;我们只需要申请中断&#xff0c;然后注册中断服务函数即可。 一、设备树中断属性 既然驱动中要注册中断服务函数&#xff0c;我们首先需要知道三个点…