Iterator模式是爲訪問容器提供一個統一的訪問方式,但是不暴露對象的內部細節。迭代器是爲容器設計的。
程序對對象的訪問必然也涉及到訪問的算法,不同的容器的訪問算法又是不一樣的。解決容器遍歷算法差異有兩種方案:第一,可以將遍歷方法塞到容器對象中去,容器承受了過多的功能,它不僅要負責自己“容器”內的元素維護(添加、刪除等等),而且還要提供遍歷自身的接口;第二,根本不提供容器遍歷算法,讓容器使用者自己去實現。該方法雖然是省事,卻又將容器的內部細節暴露無遺。 迭代器模式的出現,很好的解決了上面兩種情況的弊端,不但將遍歷容器的算法從不同集合容器類中抽象出來,同時又對外隱藏了容器的具體實現細節。
迭代器模式由以下角色組成:
1 迭代器(Iterator)角色:負責定義訪問和遍歷元素的接口。
2 具體迭代器角色(Concrete Iterator):實現迭代器接口,並記錄當前的訪問元素的位置。
3 容器角色(Contrainer):負責定義和創建迭代器接口。
Java集合框架中迭代設計模式的應用:
//迭代器 ,該接口提供了迭代遍歷的通用方法
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
//容器迭代化接口,凡是實現此接口的集合容器距可以生成相應的迭代器
public interface Iterable<T>{
//產生迭代器,將容器對象轉換爲迭代器對象
Iterator<T> interator();
}
//java集合框架的根接口,該接口繼承了容器迭代化接口,因此java中的集合都可以被迭代
public interface Collection<E> extends Iterable<E>
定義迭代器,以ArrayList爲自定義迭代容器的底層數據結構,實現自定義迭代器的代碼如下:
public class MyIterator implements Iterable {
//存放數據的集合
private ArrayList list;
//負責創建具體迭代器角色的工廠方法
public Iterator iterator() {
return new Itr(list);
}
//作爲內部類的具體迭代器角色
private class Itr implements Iterator {
ArrayList myList;
int position = 0;
public Itr(ArrayList list) {
this.myList = list;
}
public Object next() {
Object obj = myList.get(position);
position++;
return obj;
}
public boolean hasNext() {
if (position >= myList.size()) {
return false;
} else {
return true;
}
}
//不支持remove操作
public void remove(){
throw new UnsupportedOperationException(
"Alternating MyIterator does not support remove()");
}
}
}
Iterator模式的優點:
1 功能分離,簡化容器接口。容器只是實現基本的功能,把迭代器的功能交給外部類來實現,符合類的設計原則。
2 隱藏容器的設計細節
3 爲容器提供統一的訪問接口
4 可以爲容器實現多個迭代器接口
JDK中設計模式的應用:
java.util.Iterator
java.util.Enumeration