设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码

文章目录

  • 一、迭代器模式
  • 二、例子
    • 2.1 菜鸟例子
      • 2.1.1 定义迭代器接口
      • 2.1.2 定义迭代对象接口——用于返回一个迭代器
      • 2.1.3 实现 迭代对象 和 迭代器
      • 2.1.4 使用
    • 2.2 JDK源码——ArrayList
    • 2.3 Spring源码——DefaultListableBeanFactory
  • 三、其他设计模式

一、迭代器模式

类型: 行为型模式
目的: 用于顺序访问集合对象的元素,使用者不需要知道集合对象的底层表示。

二、例子

2.1 菜鸟例子

2.1.1 定义迭代器接口

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

2.1.2 定义迭代对象接口——用于返回一个迭代器

public interface Container {public Iterator getIterator();
}

2.1.3 实现 迭代对象 和 迭代器

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() {if(index < names.length){return true;}return false;}@Overridepublic Object next() {if(this.hasNext()){return names[index++];}return null;}     }
}

2.1.4 使用

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

2.2 JDK源码——ArrayList

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {@Overridepublic Iterator<E> iterator() {return new ArrayItr<>(a);}
}
private static class ArrayItr<E> implements Iterator<E> {private int cursor;private final E[] a;ArrayItr(E[] a) {this.a = a;}@Overridepublic boolean hasNext() {return cursor < a.length;}@Overridepublic E next() {int i = cursor;if (i >= a.length) {throw new NoSuchElementException();}cursor = i + 1;return a[i];}
}

2.3 Spring源码——DefaultListableBeanFactory

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {private volatile List<String> beanDefinitionNames;private volatile Set<String> manualSingletonNames;public Iterator<String> getBeanNamesIterator() {CompositeIterator<String> iterator = new CompositeIterator();iterator.add(this.beanDefinitionNames.iterator());iterator.add(this.manualSingletonNames.iterator());return iterator;}
}

迭代器CompositeIterator

public class CompositeIterator<E> implements Iterator<E> {private final Set<Iterator<E>> iterators = new LinkedHashSet();private boolean inUse = false;public CompositeIterator() {}public void add(Iterator<E> iterator) {Assert.state(!this.inUse, "You can no longer add iterators to a composite iterator that's already in use");if (this.iterators.contains(iterator)) {throw new IllegalArgumentException("You cannot add the same iterator twice");} else {this.iterators.add(iterator);}}public boolean hasNext() {this.inUse = true;Iterator var1 = this.iterators.iterator();Iterator iterator;do {if (!var1.hasNext()) {return false;}iterator = (Iterator)var1.next();} while(!iterator.hasNext());return true;}public E next() {this.inUse = true;Iterator var1 = this.iterators.iterator();Iterator iterator;do {if (!var1.hasNext()) {throw new NoSuchElementException("All iterators exhausted");}iterator = (Iterator)var1.next();} while(!iterator.hasNext());return iterator.next();}public void remove() {throw new UnsupportedOperationException("CompositeIterator does not support remove()");}
}

三、其他设计模式

创建型模式
结构型模式

  • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

行为型模式

  • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
  • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
  • 3、设计模式——策略模式(Strategy Pattern)+ Spring相关源码
  • 4、设计模式——状态模式(State Pattern)
  • 5、设计模式——观察者模式(Observer Pattern)+ Spring相关源码
  • 6、设计模式——备忘录模式(Memento Pattern)
  • 7、设计模式——模板方法模式(Template Pattern)+ Spring相关源码

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

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

相关文章

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

炫云客户端信用额度如何修改?

现在炫云新注册用户信用额度是100元&#xff0c;但是有人觉得信用额度太高了&#xff0c;想修改信用额度&#xff0c;不知道炫云的信用额度如何修改&#xff0c;今天就教大家如何修改炫云的信用额度。炫云的信用额度在炫云官网和客户端都可以修改。 我们先来看炫云官网如何修改…

蓝桥杯官网填空题(递增序列)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 对于一个字母矩阵&#xff0c;我们称矩阵中的一个递增序列是指在矩阵中找到两个字母&#xff0c;它们在同一行&#xff0c;同一列&#xff0c;或者在同一 45 度的斜…

微服务设计模式-架构真题(六十八)

UNIX的源代码控制工具(Source Code control System,SCCS)是项目开发中常用的&#xff08;&#xff09;。 源代码静态分析工具文档分析工具版本控制工具再工程工具 答案&#xff1a;C 解析&#xff1a; SCCS是版本控制工具 网闸的描述错误的是&#xff08;&#xff09;。 双…

【数据结构】归并排序 的递归实现与非递归实现

归并排序 前言一、归并排序递归实现&#xff08;1&#xff09;归并排序的核心思路&#xff08;2&#xff09;归并排序实现的核心步骤&#xff08;3&#xff09;归并排序码源详解&#xff08;4&#xff09;归并排序效率分析1&#xff09;时间复杂度 O&#xff08;N*logN&#xf…

matlab双目标定中基线物理长度获取

在MATLAB进行双目摄像机标定时,通常会获得相机的内参,其中包括像素单位的焦距(focal length)以及物理单位的基线长度(baseline)。对于应用中的深度估计和测量,基线长度的物理单位非常重要,因为它直接影响到深度信息的准确性。有时候,您可能只能获取像素单位的焦距和棋…

ffmpeg的基本功能介绍

之前对ffmpeg有一个模糊的印象&#xff0c;后来经过一些项目对ffmpeg有了深入的认识&#xff0c;这里总结下。 最开始对ffmpeg的印象是可以对视频进行一些处理操作&#xff0c;但是做哪些操作又不是很清楚&#xff0c;知其然不知其所以然。下面对于ffmpeg的功能进行一个总结&a…

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…

水库大坝可视化智能远程监管方案,助力安全监测智能巡检

一、背景需求 水库大坝作为防洪度汛的重要设施&#xff0c;其安全问题直接关系到人民群众的生命财产安全。因此&#xff0c;必须加强对大坝水库的安全管理&#xff0c;对水库除险加固和运行管护要消除存量隐患&#xff0c;实现常态化管理&#xff0c;同时要配套完善重点小型水…

Leetcode—485.最大连续1的个数【简单】

2023每日刷题&#xff08;十五&#xff09; Leetcode—485.最大连续1的个数 实现代码 int findMaxConsecutiveOnes(int* nums, int numsSize){int max 0;int i;int flag 0;int cnt 0;for(i 0; i < numsSize; i) {if(nums[i] 1) {if(flag 0) {flag 1;cnt 1;} else {…

【C++学习笔记】C++20的jthread

jthread基于std::thread主要增加了以下两个功能&#xff1a; jthread 对象被析构时&#xff0c;会自动调用join&#xff0c;等待其所表示的执行流结束。jthread支持外部请求中止&#xff08;通过 get_stop_source、get_stop_token 和 request_stop &#xff09;。 std::jthrea…

AIOPS学习资源

时间序列分析-B站-选看 时间序列分析的基础、原理、算法和应用-知乎 时间序列数据分析101 - (1) 一份全面详尽的时间序列入门教程-知乎-推荐 图解 72 个机器学习基础知识点-推荐 机器学习算法-推荐 机器学习入门与核心概念-B站 机器学习&#xff1a;盘点最常见的7种数据预…

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇

作者&#xff1a;运维有术 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…

3D人像手办定制业务再掀热潮,这一次有怎样的革新?(方法篇)

最近&#xff0c;3D真人手办热潮再起&#xff0c;最出圈的一次当属亚运会的3D打印元宇宙体验舱里面各国运动员带火的真人手办定制项目。作为3D技术推广者&#xff0c;博雅仔也在后台接受了很多朋友的询问—— ◆ 技术已经成熟了吗&#xff1f; ◆ 个人定做3D真人手办市场价格…

总结1046

考研倒计50天 7:37~9:00背诵&#xff0c;英语政治 9:04~11:33数学13年真题 2:21~3:00纠错 3:00~4:32继续纠错 4:35~6:00专业课真题 7:00~9:28英语 9:30~10:19专业课二真题 10&#xff1a;20~11:08背诵 今日共计学习11h&#xff0c;今晚先休息一会明天继续战斗。

百度百科怎么创建?百科创建需要注意哪些(一文看懂品牌/企业/人物百科创建)

随着互联网的不断发展&#xff0c;许多企业或品牌都选择创建百度百科作为一种很好的展示方式。百度百科可以被视为一张网络名片&#xff0c;拥有它能够提高人物、企业、品牌的知名度和影响力。那么人物百科、企业百科、品牌百科到底怎么创建呢&#xff1f; 大家创建百科前建议先…

3.4_Linux-浏览文件系统

1.Linux 文件系统 如果你刚接触Linux系统&#xff0c;可能就很难弄清楚Linux如何引用文件和目录&#xff0c;对已经习惯Microsoft Windows操作系统方式的人来说更是如此。在继续探索Linux系统之前&#xff0c;先了解一下它的布局是有好处的。 你将注意到的第一个不同点是&…

玻色量子“天工量子大脑”亮相中关村论坛,大放异彩

2023年5月25日至30日&#xff0c;2023中关村论坛&#xff08;科博会&#xff09;在北京盛大召开。中关村论坛&#xff08;科博会&#xff09;是面向全球科技创新交流合作的国家级平台行业盛会&#xff0c;由科技部、国家发展改革委、工业和信息化部、国务院国资委、中国科学院、…

Bug记录

那些年写过的很小的bug&#xff1a; Bug1&#xff1a; if args.model IRNN or irnn:# some code这实际上不会按你期望的方式工作。原因在于 ‘irnn’ 是一个非空的字符串&#xff0c;因此它在布尔上下文中被视为 True。所以条件总是为真&#xff0c;而不会考虑 args.model 的…

C/C++快速求素数【细节满满】

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;数论_仍有未知等待探索的博客-CSDN博客 目录 一、暴力求解 1、求1-n之间的素数&#xff08;O(n^2)&#xff09; 1.思路 2.代码 2、判断某个数x是否为素数 1.思路 2.代码 …