【设计模式】迭代器模式(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 )

抽象容器:一般是一个接口,提供一个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);

}

两者没有区别。

版权所有,转载请注明出处:

http://www.cnblogs.com/sickworm/p/4016002.html

上一篇:每日日报


下一篇:js设计模式——4.迭代器模式