迭代器模式(Iterator Pattern)是最常被使用的幾個模式之一,被廣泛地應用到Java的API中。 定義:提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。 類圖如下所示。 迭代器模式有以下4個角色。 抽象迭代器(Iterator)角色:負責定義訪問和遍歷元素的介面。 ...
迭代器模式(Iterator Pattern)是最常被使用的幾個模式之一,被廣泛地應用到Java的API中。
定義:提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。
類圖如下所示。
迭代器模式有以下4個角色。
- 抽象迭代器(Iterator)角色:負責定義訪問和遍歷元素的介面。
- 具體迭代器(Concrete Iterator)角色:實現Iterator介面,完成容器元素的遍歷。
- 抽象聚集(Aggregate)角色:提供創建迭代器角色的介面。
- 具體聚集(Concrete Aggregate)角色:實現抽象聚集介面,創建出容納迭代器的對象。
Iterator.java
public interface Iterator { public Object next(); public boolean hasNext(); }
ConcreteIterator.java
public class ConcreteIterator implements Iterator { private ConcreteAggregate agg; private int index = 0; private int size = 0; public ConcreteIterator(ConcreteAggregate agg) { this.agg = agg; size = agg.size(); index = 0; } @Override public Object next() { if (index < size) { return agg.getElement(index++); } else { return null; } } @Override public boolean hasNext() { return index < size; } }
Aggregate.java
public interface Aggregate { public void add(Object obj); public Iterator createIterator(); }
ConcreteAggregate.java
public class ConcreteAggregate implements Aggregate { private Vector vector = new Vector(); @Override public void add(Object obj) { this.vector.add(obj); } public Object getElement(int index) { if (index < this.vector.size()) { return vector.get(index); } else { return null; } } public int size() { return vector.size(); } @Override public Iterator createIterator() { return new ConcreteIterator(this); } }
Client.java
public class Client { public static void main(String[] args) { // 定義聚集對象 Aggregate agg = new ConcreteAggregate(); agg.add("張三"); agg.add("李四"); agg.add("王五"); // 遍歷 Iterator iterator = agg.createIterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
運行結果如下所示。
張三 李四 王五
優點:
- 簡化了訪問容器元素的操作,具備一個統一的遍歷介面。
- 封裝遍歷演算法,使演算法獨立於聚集角色。客戶無須知道聚集對象的類型,即使聚集對象的類型發生變化,也不會影響遍歷進程。
缺點:
- 給使用者一個序列化的錯覺,從而產生錯誤。
應用場景:
- 在java開發中,儘量不要自己寫迭代器模式,使用Java API提供的Iterator一般就能滿足項目要求。
摘自:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,133-138.