一、迭代器的定义
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。)
二、迭代器模式的应用
1、迭代器模式的优点
迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。
迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作
2、迭代器模式的缺点
迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。
3.迭代器模式的使用场景。
1、访问一个聚合对象的内容而无须暴露它的内部表示。
2、需要为聚合对象提供多种遍历方式。
3、为遍历不同的聚合结构提供一个统一的接口
三、迭代器模式的实现
/**
* 迭代器的抽象类
*
*/
public interface Iterator<E> {
//遍历下一个元素
public E next();
//是否还有下一个元素
public boolean hasNext();
//删除当前指向的元素
public boolean remove();
}
/**
* 自己实现的迭代器
*/
public class MyItrator<E> implements Iterator<E> {
private List<E> list=new ArrayList<E>();
private int cursor=0;
public MyItrator(List<E> e) {
this.list=e;
}
@Override
public E next() {
E e=null;
if(this.hasNext()){
e=this.list.get(this.cursor++);
}else{
e=null;
}
return e;
}
@Override
public boolean hasNext() {
if(this.cursor==this.list.size()){
return false;
}else{
return true;
}
}
/**
* 开发系统时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素
*/
@Override
public boolean remove() {
list.remove(cursor);
cursor++;
return true;
}
}
/**
* 集合接口
*/
public interface Aggregate<E> {
public void add(E object);
public void remove(E object);
public Iterator iterator();
}
/**
* 自定义集合
*/
public class MyConnection<E> implements Aggregate<E>{
private List<E> a=new ArrayList<E>();
@Override
public void add(E object) {
a.add(object);
}
@Override
public void remove(E object) {
a.remove(object);
}
@Override
public Iterator iterator() {
return new MyItrator<E>(this.a);
}
}
public class ClientTest {
public static void main(String[] args) {
MyConnection<String> st=new MyConnection<String>();
st.add("111");
st.add("222");
st.add("333");
st.add("444");
Iterator iterator=st.iterator();
while (iterator.hasNext()) {
String aString=(String) iterator.next();
System.out.println("ClientTest.main()"+aString);
}
}
四、 迭代器模式在源码中的应用
比如说List中的Iterator,Map中的EntryIterator等。在Android 中典型的迭代器模式例子是数据库查询使用 Cursor,当我们使用 SQLiteDatabase 的 query 方法查询数据时,会返回一个 Cursor 游标对象,该游标对象实质就是一个具体的迭代器,我们可以使用它遍历数据库查询所得到的结果集。