定义
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
类型
对象行为模式
适用性
以下情况适用迭代器模式:
- 访问一个聚合对象的内容而无需暴露它的内部表示;
- 支持对聚合对象的多种遍历;
- 为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)
结构
迭代器模式由记下几部分组成:
- 迭代器(Iterator): 定义访问和遍历元素的接口;
- 具体迭代器(ConcreteIterator): 实现迭代器接口,跟踪对聚合遍历时的位置;
- 聚合(Aggregate): 定义创建相应迭代器的接口;
- 具体聚合(ConcreteAggregate): 实现创建相应迭代器对象的接口,该操作返回 ConcreteIterator 的一个适当的实例。
优点
- 简化了遍历方式;
- 可以提供多种遍历方式;
- 封装性良好,客户端只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心;
缺点
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
代码实现
迭代器(Iterator)
public interface Iterator<E> {
boolean hasNext();
E next();
}
具体迭代器(ConcreteIterator)
public class ConcreteIterator implements Iterator {
private List list;
private int index;
public ConcreteIterator(List list) {
this.list = list;
}
@Override
public boolean hasNext() {
return index < list.size();
}
@Override
public Object next() {
Object object = list.get(index);
index++;
return object;
}
}
聚合(Aggregate)
public interface List<T> {
void add(T element);
T get(int index);
int size();
Iterator iterator();
}
具体聚合(ConcreteAggregate)
public class ConcreteAggregate implements List {
private Object[] list;
private int size;
private int index;
public ConcreteAggregate() {
list = new Object[100];
}
@Override
public void add(Object obj) {
list[index++] = obj;
size++;
}
@Override
public Iterator iterator() {
return new ConcreteIterator(this);
}
@Override
public Object get(int index) {
return list[index];
}
@Override
public int size() {
return size;
}
}
客户端(Client)
public class Client {
public static void main(String[] args) {
new Client().test();
}
private void test() {
List list = new ConcreteAggregate();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("eee");
list.add("ddd");
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
输出
aaa
bbb
ccc
eee
ddd
参考代码
https://github.com/xueyufish/design-pattern/tree/master/iterator