一、什么是迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部实现,这样既可以做到不暴露集合内部的结构,又可以让外部代码透明地访问集合内部数据。像Java中List他有一个iterator方法,这个方法可以用来遍历List中的元素,这种就是一种迭代器模式
二、迭代器的模式结构
抽象容器角色:负责提供具体迭代器角色的接口,一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体容器角色:实现抽象容器的具体实现类,比如List接口的实现ArrayList等。
抽象迭代器角色:负责定义访问和遍历元素的接口。
具体迭代器角色:实现迭代器接口,并记录遍历中的当前位置。
三、迭代器模式的使用场景
- 访问一个集合的内容而无需暴露它的内部表示。
- 为遍历不同的集合提供一个统一的接口。
四、迭代器模式的具体实现
抽象聚合类
public interface Container {
Iterator getIterator();
}
迭代器抽象类
public interface Iterator {
boolean hasNext();
Object next();
}
具体聚合类和具体迭代器角色
public class NameRepository implements Container {
public String names[] = {"Robert", "John", "Julie", "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index = 0;
@Override
public boolean hasNext() {
if (index < names.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (hasNext()) {
return names[index++];
}
return null;
}
}
}
测试代码
public static void main(String[] args) {
NameRepository nameRepository = new NameRepository();
Iterator iterator = nameRepository.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
五、迭代器模式的优缺点
优点
- 简化了遍历方式,比如对一些没有序列的数据结构,如:TreeSet。
- 提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性好,用户只需要得到迭代器就可以遍历,不用关心遍历算法。
缺点
- 对于简单的遍历,使用迭代器方式比较繁琐,比如ArrayList。