定义
提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。
优点:
- 访问一个聚合对象的内容而无须暴露它的内部表示。
- 遍历任务交由迭代器完成,这简化了聚合类。
- 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
- 增加新的聚合类和迭代器类都很方便,无须修改原有代码,体现“开放-封闭原则”。
- 封装性良好,为遍历不同的聚合结构提供一个统一的接口。
缺点:
增加了类的个数,这在一定程度上增加了系统的复杂性。
模式结构
在迭代器模式中,一共有两种角色:迭代器 和 容器
- 迭代器 Iterator:封装了迭代容器的接口
- 容器 Container:存储元素的东西
- 容器若要具备迭代的能力,就必须拥有getIterator()函数,该函数将会返回一个迭代器对象
- 每个容器都有属于自己的迭代器内部类,该内部类实现了Iterator接口,并实现了其中用于迭代的两个函数hasNext()和next()
- boolean hasNext():用于判断当前容器是否还有尚未迭代完的元素
- Object next():用于获取下一个元素
代码实现
- 迭代器接口:
public interface Iterator {
public boolean hasNext();
public Object next();
}
- 容器接口:
public interface Iterator {
public boolean hasNext();
public Object next();
}
- 具体的容器(必须实现Container接口):
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;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
- 具体的容器实现了
Container
接口,并实现了其中的getIterator()
函数,该函数用于返回该容器的迭代器对象。 - 容器内部需要实现自己的迭代器内部类,该内部类实现
Iterator
接口,并实现了其中的hasNext()
和next()
函数。
当容器和容器的迭代器创建完毕后,接下来就轮到用户使用了,使用就非常简单了:
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
- 对于使用者而言,只要知道
Iterator
接口,就能够迭代所有不同种类的容器了。
参考:
(1)柴毛毛大话设计模式——开发常用的设计模式梳理 https://blog.csdn.net/u010425776/article/details/79211117
(2)迭代器模式(详解版) http://c.biancheng.net/view/1395.html