文章目录
更多关于设计模式的文章请点击:设计模式之禅(0)-目录页
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
一、迭代器模式的相关表示
1.1、迭代器角色(Iterator
)
定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next()
,判断是否遍历结束的方法hasNext()
,移出当前对象的方法remove()
1.2、具体迭代器角色(Concrete Iterator
)
实现迭代器接口中定义的方法,完成集合的迭代,是具体容器角色需要为客户端提供的迭代器。
1.3、容器角色(Aggregate
)
一般是一个接口,提供一个createIterator()
方法,例如java中的Collection接口,List接口,Set接口等,这个角色一般有JDK标准库提供(iterator()方法
)。
1.4、具体容器角色(ConcreteAggregate
)
就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等,这个角色一般有JDK标准库提供。
二、List中关于迭代器的实现
本次的迭代器模式不再自己写代码,而是用List接口和ArrayList实现类作为容器角色和具体容器角色进行分析,我们这次以一个用户的角度去看迭代器模式:
- Client
/**
* @Auther: ARong
* @Date: 2018/12/3 16:20
* @Description: 测试迭代器模式客户端
*/
public class Client {
@Test
public void fun1(){
//创建一个ArrayList存10个数字
List list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
//使用迭代器去遍历元素
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next()+"\t");
}
}
}
我们查看ArrayList的源代码关于iterator()方法的部分:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
我们可以看出Itr类就是Iterator接口的实现类,对Iterator的hasNext()和next()方法进行了相应的重写。