Android 設計模式 - 迭代器模式
1. 定義
提供一種方法訪問一個容器物件中各個元素,而又不暴露該物件的內部細節。
2. 作用
在遍歷集合的時候,把在元素之間遊走的責任交給迭代器,而不是集合。
3. 結構
-
抽象容器
一般是一個介面,提供一個 iterator() 方法,例如 Java 中的 Collection 介面。
-
具體容器
就是抽象容器的具體實現類,比如 List 介面的實現有序列表 ArrayList,List 介面的連結串列實現 LinkList,Set 介面的雜湊列表的實現 HashSet 等。
-
抽象迭代器
定義遍歷元素所需要的方法,一般會有兩個方法:取得下一個元素的方法 next(),判斷是否遍歷結束的方法 hasNext(),移出當前物件的方法 remove()。
-
具體迭代器
實現迭代器介面中定義的方法,完成集合的迭代。
4. 實現

類圖
- 抽象容器介面,可以當作 Collection 介面的簡化版。
public interface Aggregate<E> { /** * 新增元素 * * @param data */ void add(E data); /** * 移除元素 * * @param data */ void remove(E data); /** * 迭代器 * * @return */ Iterator<E> iterator(); }
- 迭代器介面,類似 Java 內建的迭代器。
public interface Iterator<E> { /** * 是否存在下一個元素 * * @return */ boolean hasNext(); /** * 獲取下一個元素 * * @return */ E next(); }
- 具體容器和迭代器,這裡使用 ArrayList 作為內部儲存,迭代器順序遍歷集合。
public class ConcreteAggregate<E> implements Aggregate<E> { private List<E> list = new ArrayList<>(); @Override public void add(E data) { list.add(data); } @Override public void remove(E data) { list.remove(data); } @Override public Iterator<E> iterator() { return new InnerIterator(); } /** * 迭代器 */ private class InnerIterator implements Iterator<E> { private int cursor; @Override public boolean hasNext() { return cursor < list.size(); } @Override public E next() { E data = list.get(cursor); cursor++; return data; } } }
- 測試,使用起來和 Java 內建的集合是不是很像。
public static void main(String args[]) { Aggregate<String> aggregate = new ConcreteAggregate<>(); aggregate.add("小劉"); aggregate.add("小李"); aggregate.add("小王"); Iterator<String> iterator = aggregate.iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.println(name); } }
5. 優缺點
1. 優點
迭代器簡化了遍歷一個聚合物件的方式,在同一個聚合上可以有多個遍歷。在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
2. 缺點
由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
3. 使用場景
迭代器模式是與集合共存的。一般來說,我們只要實現一個集合,就需要同時提供這個集合的迭代器,就像 Java 中的 Collection、Set、Map 等,這些集合都有自己的迭代器。假如我們要實現一個這樣的新容器,當然也需要引入迭代器模式,給我們的容器新增一個迭代器。
【附錄】

資料圖