对外提供统一的顺序访问数据的的接口。不对外暴露内部细节。
当面对多种数据源,并且,数据存储的格式不同(list,数组),可以使用迭代器,将访问数据的格式进行统一,不对外暴露内部细节。
例子来源 《Android源码设计模式解析与实战》
迭代器接口
public interface Iterator<T> {
T next();
boolean hasNext();
}
容器接口,用来获取具体迭代器角色
public interface Aggregate<T> {
Iterator<T> iterator();
}
具体的迭代器类,实现迭代器接口,并记录遍历的当前位置。
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list ;
int index = 0;
public ConcreteIterator(List<T> list) {
this.list = list;
}
@Override
public T next() {
if (hasNext()) {
return list.get(index++);
}
return null;
}
@Override
public boolean hasNext() {
return index < list.size();
}
}
具体的容器类,迭代器角色与容器关联。
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list = new ArrayList<>();
public void add(T t) {
list.add(t);
}
public void remove(T t) {
list.remove(t);
}
@Override
public Iterator<T> iterator() {
return new ConcreteIterator<>(list);
}
}
client
public class Main {
public static void main(String[] args) {
ConcreteAggregate concreteAggregate = new ConcreteAggregate();
concreteAggregate.add("TtTTT4");
concreteAggregate.add("TtTTT3");
concreteAggregate.add("TtTTT2");
concreteAggregate.add("TtTTT1");
Iterator<String> iterator = concreteAggregate.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
System.out.println(s);
}
}
}