顧名思義,迭代器就是用於迭代操作的對象,其能夠像有序序列一樣迭代獲取集合中對象,並且能夠記錄下當前所在位置,因此也稱游標。 ...
簡介
迭代器設計模式(Iterator Design Pattern),也叫作游標設計模式(Cursor Design Pattern)。
迭代器模式將集合對象的遍歷操作從集合類中拆分出來,放到迭代器類中,讓兩者的職責更加單一。
其定義是,提供一種方法來訪問聚合對象,而不暴露這個對象的內部實現。
典型實現
首先,定義一個用於遍歷聚合對象中所存儲元素的抽象迭代器介面,其代碼示例如下:
public interface Iterator {
// 將游標指向第一個元素
public void first();
// 將游標指向下一個元素
public void next();
// 判斷是否存在下一個元素
public boolean hasNext();
// 獲取游標指向的當前元素
public Object currentItem();
}
然後,我們通常將存儲數據的類稱作為聚合類,一般會在聚合類中創建迭代器對象,如下是抽象聚合介面的代碼示例:
public interface Aggregate {
public Iterator creteIterator();
}
在具體迭代器類中,我們需要註入聚合對象,以便後續使用迭代器時能訪問到其數據,其代碼示例如下:
public class ConcreteIterator implements Iterator {
private Aggregate objects;
private Object cursor;
public ConcreteIterator(Aggregate objects) {
this.objects = objects;
}
// 將游標指向第一個元素
public void first() {}
// 將游標指向下一個元素
public void next() {}
// 判斷是否存在下一個元素
public boolean hasNext() {}
// 獲取游標指向的當前元素
public Object currentItem() {}
}
在具體聚合類中,通常是實現存儲數據的邏輯,以及指定具體迭代器的對象,其代碼示例如下:
public class ConcreteAggregate implements Aggregate {
public Iterator creteIterator() {
return new ConcreteIterator(this);
}
}
總結
優點
迭代器模式的主要優點如下:
- 封裝性良好,訪問一個聚合對象的內容而無需暴露它的內部實現
- 將遍歷操作交給迭代器,簡化了複雜聚合類的設計
- 支持以不同的方式遍歷聚合對象,在同一個聚合對象上可以定義多種遍歷方式
- 增加新的聚合類和迭代器類都很方便,滿足開閉原則
缺點
迭代器模式的主要缺點如下:
- 迭代器模式將存儲數據和遍曆數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加
- 抽象迭代器的設計難度較大,需要充分考慮系統將來的擴展
適用場景
迭代器模式的適用場景如下:
- 訪問一個聚合對象的內容而無需暴露它的內部實現
- 需要為一個聚合對象提供多種遍歷方式
- 為遍歷不同的聚合對象提供一個統一的介面
源碼
在 Java 中,迭代器的應用非常廣。
最頂層的 Collection
集合介面繼承了 Iterable
介面,其實表明瞭所有的集合對象都是可迭代對象,並且都需要實現獲取 Iterator
對象的方法。
將這個源碼映射到典型實現中,Iterable
介面和 Collection
介面就是抽象聚合介面,Iterator
介面則是抽象迭代器介面。