创建一个迭代器,并将一个容器类注入迭代器,使用迭代器这个中间件来实现对容器类的迭代操作
迭代器模式又称为游标模式,它最早源于对容器类的访问。如果我们把遍历的方法放在容器中,那么对于容器类而言就承载了太多的功能,不太符合单一职责原则,而如果暴露给用户实现又会暴露对象的内部实现,因为,迭代模式应运而生,在访问类和容器类中插入了个第三者——迭代器。
public class ConcreteIterator<T> implements Iterator<T> {
private List<T> list = new ArrayList<T>();
private int cursor = 0;
public ConcreteIterator (List<T> list) {
this.list = list;
}
@override
public boolean hasNext() {
return cursor != list.size();
}
@override
public T next() {
T obj = null;
if (this.hasNext()) {
obj = this.list.get(cursor++);
}
return obj;
}
}
public class ConcreteAggregate<T> {
private List<T> list = new ArrayList<T>();
@override
public void add(T obj) { list.add(obj); }
@override
public void remove(T obj) { list.remove(obj); }
@override
public Iterator<T> iterator() {
return new ConcreteIterator<T>(list)
}
}
// 遍历用的代码
while (CpmcreteAggregate.iterator().hasNext()) {
// 进行相应的操作
}
对于迭代模式而言,其优点就是支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类和遍历算法的关系。
当然,现在每一种高级语言都有各个容器迭代器的内部实现,所以开发者很少去实现一个迭代器,主要时了解即可,例如Android常用的迭代器模式 —— 数据库查询。