1 迭代器模式概念
1.1 介绍
迭代器模式,又叫做游标模式,是行为型设计模式之一。我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现去吧。这两种情况好像都能够解决问题。
然而在前一种情况,容器承受了过多的功能,它不仅要负责自己“容器”内的元素维护(添加、删除等等),而且还要提供遍历自身的接口;而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历。第二种方式倒是省事,却又将容器的内部细节暴露无遗。
正因于此,迭代器模式应运而生,在客户访问类与容器体之间插入一个第三者–迭代器,很好的解决了上述弊端。
1.2 定义
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。
1.3 使用场景
遍历一个容器对象时。
2 迭代器模式UML类图通用
3 迭代器模式简单实现
(1)抽象迭代接口
/**
* 抽象迭代接口
* @param <T>
*/
public interface Iterator<T> {
// 是否还有下一个元素
boolean hasNext();
T next();
}
(2)具体的迭代角色
/**
* 具体的迭代角色-间谍
* @param <T>
*/
public class ConcreteItertor<T> implements Iterator<T> {
private List<T> list = new ArrayList<>();
private int cursor = 0;
public ConcreteItertor(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 = list.get(cursor++);
}
return obj;
}
}
(3)容器的接口
/**
* 容器的接口
*/
public interface Aggregate<T> {
void add(T t);
void remove(T t);
Iterator<T> iterator();
}
(4)具体的容器接口
/**
* 具体的容器接口——军队
* @param <T>
*/
public class ConcreteAggregate<T> implements Aggregate<T>{
private List<T> list=new ArrayList<>();
@Override
public void add(T t) {
list.add(t);
}
@Override
public void remove(T t) {
list.remove(t);
}
@Override
public Iterator<T> iterator() {
return new ConcreteItertor<>(list);
}
}
(5)客户端
public class Client {
public static void main(String[] args) {
// 实例化容器类对象
Aggregate<String> aggregate = new ConcreteAggregate<>();
aggregate.add("小兵1");
aggregate.add("小兵2");
aggregate.add("小兵3");
Iterator<String> iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
(6)结果
4 Android源码中的迭代器模式
(1)Cursor
当我们使用SQLiteDatabase的query方法查询数据库时,会返回一个Cursor游标对象,该游标的实质就是一个具体的迭代器,我们可以使用它来遍历数据库查询所得的结果集。
5 总结
迭代器模式发展至今,几乎所有的高级语言都有相应的内置实现,对于开发者而言,已经极少会自己去实现迭代器了,所以本章内容更多的是了解而非应用。
5.1 优点
(1)符合面向对象设计原则中的单一职责原则。
(2)支持对容器对象的多种遍历。弱化了容器类与遍历算法之间的关系。
5.2 缺点
(1)类文件的增加。
(2)会出现ConcurrentModificationException异常。
(3)遍历过程是一个单向且不可逆的遍历。
6 参考文章与链接
《Android源码设计模式解析与实战》
《设计模式之禅》