【导读】有时需要访问某个集合中的元素,例如二叉树访问,会提供一个访问器,具体是前序遍历、中序遍历还是后续遍历,都会返回下一个元素,至于树中结构是不会直接显示的,这就是迭代器模式。
一、定义
提供一种方法,顺序访问集合中的每一个元素,而又不暴露该对象的内部表示。
二、实例
创建一个集合,底层是List,在创建一个迭代器去迭代访问该集合。
集合对象:
//抽象集合对象
public interface MyCollection {
void add(Object object);
void remove(Object object);
MyIterator getIterator();
}
//具体集合对象
public class MyCollectionImpl implements MyCollection{
//底层是用ArrayList进行封装
private List<Object> list = new ArrayList<Object>();
@Override
public void add(Object object) {
list.add(object);
}
@Override
public void remove(Object object) {
list.remove(object);
}
@Override
public MyIterator getIterator() {
return new MyIteratorImpl(list);
}
}
迭代器对象:
//迭代器接口
public interface MyIterator {
//是否有下一个元素
boolean hasNext();
//返回下一个元素
Object next();
}
//具体迭代器对象
public class MyIteratorImpl implements MyIterator {
private List<Object> list;
//记录偏移量
private int position;
//记录集合元素数量
private int size;
public MyIteratorImpl(List<Object> list) {
this.list = list;
this.position = 0;
this.size = list.size();
}
@Override
public Object next(){
Object o = list.get(position);
position++;
return o;
}
@Override
public boolean hasNext() {
if (position < size ){
return true;
}
return false;
}
}
测试类:
MyCollection myCollection = new MyCollectionImpl();
myCollection.add("a");
myCollection.add("b");
myCollection.add("c");
MyIterator iterator = myCollection.getIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
运行结果:
类图:
三、源码实例
(1)List接口的ListIterator