package com.selfStudy;
import java.util.*;
/*
* [结合java:四器 之 迭代器](http://blog.csdn.net/managementandjava/article/details/51404884)
*
* 通过以下两个例子来展现iterator的用法;
* 首先理解下为什么存在迭代器;
* 迭代器就是集合取出元素的方式;
* 因为每个容器都有 存和取的功能,由于每个容器的数据存储结构不同,其存和取的方式也就不同;而对于取出元素,其不止一个动作来完成(先判断 再取等多个动作)
* 那么这多个动作就应该封装成一个对象;这样每个容器中就都有一个取出数据的对象;因为不同容器的数据结构不同,因此每个容器中取出对象的实现方式也不一样;
* 那么就应该在每个容器内部 定义一个取出元素的内部类(因为数据就存在这个容器中,直接用内部类来操作这些数据时最方方便的,因此用内部类),但是这些取出
* 的内部类有自己的共性东西 都有 判断和取出。因此就可以向上抽取成一个接口(Iterator)
*
* 对内部类的理解和迭代器设计模式的理解:
* 内部类: 容器是一个事物,而容器内部存储的东西也是一个事物,那么就可以定一个内部类在容器内操容器内的事物;
* 迭代器设计模式:多个类都有自己操作其内部数据的方式,而这些方式又有相同的共性,那么就可以把这个共性抽取成一个接口,在各个类中提供一个方法
* 来返回这个接口,通过这个接口(进而通过内部类)来操作这多个类中的数据;
*
* 迭代器设计模式:
* 又称游标设计模式:GOF给出的定义:提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节
* 组成元素:
* 1.抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:next(),hasNext()和remove(),
* 2.迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
* 3.抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
* 4.具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList.
*
* 使用场景:
* 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的
* Collection,List、Set、Map等,这些集合都 * 有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引
* 入迭代器模式,给我们的容器实现一个迭代器。
* */
//实例1:
//1.抽象迭代器
interface MyIterator{
public Object next();
public boolean hasNext();
}
//2.迭代器实现
class MyListIterator implements MyIterator{
private List<?> list = null;
public MyListIterator(List<?> list){
this.list = list;
}
private int count = 0;
public Object next(){
Object obj=null;
if(this.hasNext()){
obj = list.get(count++);
}
return obj;
}
public boolean hasNext(){
if(count==list.size())
return false;
else
return true;
}
}
//抽象容器
interface MyCollection{
public void addAll(Object[] objs);
public MyIterator iterator();
}
//具体容器
class MyListCollection implements MyCollection{
private List<Object> list= new ArrayList<Object>();
public void addAll(Object[] objs) {
for(Object obj:objs)
list.add(obj);
}
@Override
public MyIterator iterator() {
return new MyListIterator(list);
}
}
public class IteratorModel {
public static void main(String[] args) {
String[] infos = "hello java : wo should say hello to the world !!".split(" ");
MyListCollection mc = new MyListCollection();
mc.addAll(infos);
for(MyIterator mi = mc.iterator();mi.hasNext();){
System.out.print(mi.next()+" ");
}
}
}
输出结果:
hello java : wo should say hello to the world !!