设计模式之迭代器模式解析学习源码(十八)

原文献上, 点击滴滴滴


迭代器模式(Iterator)定义: 提供一种方法顺序访问聚合对象的各个元素吗而又不暴露该对象的内部展示

不用Iterator的坏处

  • 原文中编写了三个简单的集合 ArraryList HashSet LinkedList 原先是没有实现Iterable 内部没有具体实现iterator
  • 问题1: 遍历的时候遍历了几次
    • 使用数组遍历的时候实际是遍历了两次, 由于System.arrayCopy 和 set的 toArray 看不到源码, 但是LinkedList 可以看到链表遍历了一次, 然后我们再遍历这个数组, 打印
  • 问题2: 如何解决这个问题
    • 可以给 LinkedList ArrayList 加get(index)的方法遍历, 但是HashSet就没法了, 实际上是Map的key集合, 无序的, 实际上这里面linkedList的get 比较麻烦了, 所以有查询的性能的问题
  • 总结: 牛人左哥: "那就用迭代器模式吧"

看迭代器模式与非迭代的UML区别

  • 很相似, 但迭代器模式有个接口这个概念
  • 遍历对象的区间

迭代器模式有哪些说不上的缺点

  • 具体的集合类与具体的迭代器是绑定的关系, 这种实现方式几乎没有复用的可能, 可以看着是特事特办, 算是把双刃剑, 权衡自己把握

class文件的描述

  • 以前重来都没有去尝试解析
  • 现在先记下
    • invoke 调用 virtual(实现类)方法 interface(接口)方法
    • astore 赋值栈 _33+1个引用变量
    • aload 压入值栈 _33+1个引用变量
    • checkcast 检测类型转换
    • getStatic 获取静态属性
    • ifne 如果返回true就 执行
时间: 2025-01-13 06:54:20

设计模式之迭代器模式解析学习源码(十八)的相关文章

设计模式之迭代器模式--- Pattern Iterator

模式的定义 迭代器模式定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 类型 行为类 模式的使用场景 方便遍历访问容器内的元素 优点 面向对象设计原则中的单一职责原则,对于不同的功能,我们要尽可能的把这个功能分解出单一的职责,不

Android中图片加载框架Glide解析2----从源码的角度理解Glide的执行流程

转载地址:http://blog.csdn.net/guolin_blog/article/details/53939176 在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),Glide的基本用法 . 在多数情况下,我们想要在界面上加载并展示一张图片只需要一行代码就能实现,如下所示: Glide.with(this).load(url).into(i

Duilib 学习源码系列1-创建控件

好了,昨天研究出了为什么加载xml结束以后我在自己新建一个控件位置不能调整,原来要先add才能调属性. 本来这个是昨天的任务,虽然这块内容是前天就看完的,权当边写边复习吧. 上一篇提到 <VerticalLayout name="window" bkcolor="#FFFFFFFF" bkcolor2="#FFAAAAA0" bkcolor3="#00000000"> 代表了一个控件字符串; 上次忘记说了 及时经过

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)

1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器.于是源码笔记以此为切入点,将SpringBoot作为我们源码分析的第一个开源项目,之后还会对更多开源项目进行源码分析.要进行源码分析,笔者结合自身经历来跟大家聊聊我们为什么要学习源码这个话题,大家一起探讨学习. 我们程序员在开发代码时每天都在使用别人写好的框架,无论你是在使用Spring生态的Spring核心,SpringMVC,SpringBoot和Sprin

设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的1

最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u92-windows-x64),JDK安装路径里有个"src.zip"就是JDK的源码文件压缩包: 设置好环境变量的JAVA_HOME变量和PATH变量(JAVA_HOME变量值也是D:\Java\jdk-8u92-windows-x64). 然后打开Eclipse设置可以Debug模式调试

GlusterFS源码解析 —— GlusterFS 源码安装

安装环境: CentOS6.2 glusterfs-3.4.3 GlusterFS 挂载需要 fuse 支持,如果你的内核版本低于 2.6.16 则需要下载fuse的源码包自行编译安装,也可下载 fuse 的rpm包.安装fuse的方法我就不说了,不会源码安装的直接去rpmfind.net上下载rpm即可.高于此版本的内核中已经有了fuse.ko的模块,需要的时候可以执行以下命令进行加载: modprobe -b fuse 1.下载GlusterFS的源码包,目前已经有更新版本 : wget h

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

【设计模式】——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato