1、案例介绍
提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。自定义容器和迭代器。
2、案例设计
迭代器角色(Iterator)、具体迭代器角色(Concrete Iterator)、容器角色(Container)、具体容器角色(Concrete Container)。
定义具体的迭代器角色(我们可以取名为MyIterator)用来实现迭代器角色接口(如Iterator接口,在使用当中,其主要包含hasNext()方法和next()方法)。对于容器角色和具体的容器角色,可以比较直观地把List看作是容器角色,而把ArrayList看作是具体容器角色。
3、具体实现
(1)迭代器角色
package com.iotech.myiterator;
public interface Iterator<T> {
public boolean hasNext();//判断是否有下一个元素
public T next();//获取下一个元素的内容
}
(2)容器角色
package com.iotech.myiterator;
public interface List<T> {
public void add(T obj);//给具体的容器添加元素
public T get(int index);//获取指定位置上的元素
public int size();//获得容器中的元素个数
public Iterator<T> iterator();//得到具体的迭代器对象
}
(3)具体的迭代器角色
package com.iotech.myiterator;
public class MyIterator<T> implements Iterator<T> {
private List list=null;
private int index=0;//访问到容器中元素的当前下标
//创建一个迭代器对象的时候接收要被迭代的具体的容器对象
public MyIterator(List<T> list){
this.list=list;
}
//判断是否有下一个元素
@Override
public boolean hasNext() {
return index<list.size();
}
//取出下一个元素
@SuppressWarnings("unchecked")
@Override
public T next() {
return (T) list.get(index++);
}
}
(4)具体的容器角色
package com.iotech.myiterator;
public class ArrayList<T> implements List<T> {
private Object[] obj=null;//声明一个Object类型的数组(泛型是不能声明泛型数组的)
private int index;//数组的下标
private int size;//记录数组中元素的个数
public ArrayList(){
obj=new Object[10];
index=0;
size=0;
}
@Override
public void add(T obj) {
this.obj[index++]=obj;//把数据存放到数组中
size++;//元素个数加1
}
@SuppressWarnings("unchecked")
@Override
public T get(int index) {
return (T) this.obj[index];
}
@Override
public int size() {
return size;
}
@Override
public Iterator<T> iterator() {
return new MyIterator<T>(this);
}
}
(5)测试类
package com.iotech.myiterator;
public class Test {
public static void main(String[] args) {
List<String> nameList=new ArrayList<String>();
nameList.add("zhangsan");
nameList.add("lisi");
nameList.add("wangwu");
nameList.add("chenhao");
Iterator<String> iterator=nameList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}