【设计模式】迭代器模式(Iterator )
摘要:
1.本文将详细介绍迭代器模式的原理和实际代码中特别是Android系统代码中的应用。
纲要:
1. 引入迭代器模式
2. 迭代器的概念及优缺点介绍
3. 迭代器在Android源码中的应用
1.段子404 Not Found:
迭代器(迭代子)模式真的找不到段子了,不过好在这个模式不仅非常好理解,而且例子很多。cnblogs博主卡奴达摩曰:如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式。下面我们一起来学习。
2.迭代器模式介绍
2.1什么是迭代器模式?
为集合(或称容器)如Collection、List、Set、Map等提供统一的遍历接口,提高代码复用能力,并隐藏内部实现的表示。
2.2迭代器模式有什么好处/坏处?
(摘自http://blog.csdn.net/zhengzhb/article/details/7610745)
优点:
1、简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
2、可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
3、封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
缺点(博客原文):
1、对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
这个观点是不准确的,因为Java为实现了迭代器模式的类提供了遍历语法:
// Type是具体的类型,如String。c是实现了迭代器的容器。
for(Type t : c) {
// 对t的操作...
}
既方便又安全。
2.3迭代器模式的结构:
(参考http://blog.csdn.net/zhengzhb/article/details/7610745)
UML:
![]()
抽象容器:一般是一个接口,提供一个iterator()获得迭代器实例的方法,例如java中的Collection接口,List接口,Set接口等。
具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove()。
迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
Java自身已经实现了迭代器模式,并提供了丰富的实现了迭代器的集合类,所以我们基本上不需要自己再去创建一个新类,直接使用Java提供的类已经足够了。
3.源码实战:
3.1Scanner:
Scanner就是Java界的scanf(),通过new Scaner(System.in)来从命令行窗口获取输入。但我们在Android是基本不会用到这个类的,因为我们的应用都是通过屏幕和按键交互,除非你写的是运行在shell中的Java命令。Scanner实现了Iterator接口,拥有hasNext,next,remove三个方法。它是一个迭代器,这是一个直接使用迭代器的例子。
一般我们使用的方法是:
while(mScanner.hasNext()) {
String str = (String)mScanner.next();
}
3.2ArrayList:
ArrayList继承List类,实现了Iterable接口(和上面的Iterator接口不一样)。注意Iterable是给容器类实现的,说明我是一个可以“生”出迭代器的类;Iteator接口是给迭代器实现的,说明我是一个迭代器。ArrayList最常用的方法:
List<String> mArrayList = new ArrayList<String>();
mArrayList.add(a);
mArrayList.add(b);
mArrayList.add(c);
……
//遍历
for(String a : mArrayList) {
System.out.println(a);
}
当然你也可以使用传统的方法遍历:
Iterator it = mArrayList.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);
}
两者没有区别。
版权所有,转载请注明出处:
【设计模式】迭代器模式(Iterator )的更多相关文章
- 设计模式 - 迭代器模式(iterator pattern) 具体解释
迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一 ...
- javascript设计模式-迭代器模式(Iterator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#设计模式——迭代器模式(Iterator Pattern)
一.概述在软件开发过程中,我们可能会希望在不暴露一个集合对象内部结构的同时,可以让外部代码透明地访问其中包含的元素.迭代器模式可以解决这一问题.二.迭代器模式迭代器模式提供一种方法顺序访问一个集合对象 ...
- 设计模式 -- 迭代器模式(Iterator)
--------------------------------------------------------------------- 1.场景问题 考虑这样一个问题: 9个学生对象分别通过数组存 ...
- 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)
上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...
- 深入浅出设计模式——迭代器模式(Iterator Pattern)
模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构.针对不同的需要,可能还要以不同的方式遍历整个聚合对象,但是我 ...
- 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)
设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的 ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- 迭代器模式 Iterator 行为型 设计模式(二十)
迭代器模式(Iterator) 走遍天下,世界那么大,我想去看看 在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...
- Java 设计模式系列(十五)迭代器模式(Iterator)
Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...
随机推荐
- hdu5575 Discover Water Tank
题意: 给出个水箱,水箱两侧有无限高的隔板,水箱内有整数高度的隔板将水箱分成n-1份,现在给出m个限制,每个限制表示某个位置的某个高度有水或没水,问最多能同时满足多少个限制.n,m<=2*10^ ...
- Python 源码剖析(一)【python对象】
处于研究python内存释放问题,在阅读部分python源码,顺便记录下所得.(基于<python源码剖析>(v2.4.1)与 python源码(v2.7.6)) 先列下总结: ...
- DFS染色解决区域分块问题UVALive 6663
怪我比赛的时候想法太过于杂乱了. 注重于区域的属性了.甚至还想用状态压缩或者是hash来描述分块的区域. 其实我们的可以宏观的角度去审视这个问题.就是求分区的问题.那么我们完全可以标记边框的值为1.即 ...
- [洛谷P4512]【模板】多项式除法
题目大意:给定一个$n$次多项式$F(x)$和一个$m$次多项式$G(x)$,请求出多项式$Q(x),R(x)$,满足: 1. $Q(x)$次数为$n-m$,$R(x)$次数小于$m$2. $F(x) ...
- Spark2.1.0之初识Spark
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...
- UOJ228:基础数据结构练习题——题解
http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...
- ContestHunter暑假欢乐赛 SRM 05
T1 组合数,求一下乘法逆元就行了 没取模 没1LL* 爆零了 T2 让最大子段和最小就行,跑最大子段和的时候若超过S就弹出堆中最大的数,每次有负数加进来不断弹出最小的数相加重新加进堆直到为正数,因为 ...
- [BZOJ1131/POI2008]Sta树的深度
Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...
- 面向小数据集构建图像分类模型Keras
文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data. ...
- k好数 数位dp
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...