1. 程式人生 > >「補課」進行時:設計模式(13)——迭代器模式

「補課」進行時:設計模式(13)——迭代器模式

![](https://cdn.geekdigging.com/DesignPatterns/java_design_pattern.jpg) ## 1. 前文彙總 [「補課」進行時:設計模式系列](https://www.geekdigging.com/category/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/) ## 2. 迭代器模式 一說到迭代器,我首先想到的就是 Java 中的 `java.util.Iterator` 介面,開啟看了一下 JDK1.8 的 API 檔案,可以看到是從 1.2 的版本中開始新增 `java.util.Iterator` 這個介面,並逐步把 Iterator 應用到各個聚集類(Collection)中,同時可以看到另一個介面 `java.lang.Iterable` ,可以看到 `java.lang.Iterable` 有很多的子類以及實現類: ![](https://cdn.geekdigging.com/DesignPatterns/13/Iterable_API.png) 基本上我們日常使用的類都在上面這張圖裡了, Java 把迭代器模式已經加入到了最基本的 API 當中,我們在使用各種集合進行迭代的時候才能如此的輕鬆寫意。 ### 2.1 定義 迭代器模式(Iterator Pattern)目前已經是一個沒落的模式,基本上沒人會單獨寫一個迭代器,除非是產品性質的開發,其定義如下: Provide a way to access the elements of an aggregate object sequentiallywithout exposing its underlying representation.(它提供一種方法訪問一個容器物件中各個元素,而又不需暴露該物件的內部細節。) ![](https://cdn.geekdigging.com/DesignPatterns/13/Iterator_UML.png) - Iterator: 抽象迭代器,基本上是有固定的3個方法: first() 獲得第一個元素, next() 訪問下一個元素, hasNext() 是否已經訪問到底部。 - ConcreteIterator: 具體迭代器角色要實現迭代器介面,完成容器元素的遍歷。 - Aggregate: 抽象容器,負責提供建立具體迭代器角色的介面。 - ConcreteAggregate: 具體容器實現容器介面定義的方法,創建出容納迭代器的物件。 抽象迭代器: ```java public interface Iterator { Object next(); boolean hasNext(); boolean remove(); } ``` 具體迭代器: ```java public class ConcreteIterator implements Iterator { private Vector vector = new Vector(); public int cursor = 0; public ConcreteIterator(Vector vector) { this.vector = vector; } @Override public Object next() { Object result = null; if (this.hasNext()) { result = this.vector.get(this.cursor++); } else { result = null; } return result; } @Override public boolean hasNext() { if (this.cursor == this.vector.size()) { return false; } else { return true; } } @Override public boolean remove() { this.vector.remove(this.cursor); return true; } } ``` 抽象容器: ```java public interface Aggregate { void add(Object o); void remove(Object o); Iterator iterator(); } ``` 具體容器: ```java public class ConcreteAggregate implements Aggregate { private Vector vector = new Vector(); @Override public void add(Object o) { this.vector.add(o); } @Override public void remove(Object o) { this.vector.remove(o); } @Override public Iterator iterator() { return new ConcreteIterator(vector); } } ``` 測試類: ```java public class Test { public static void main(String[] args) { Aggregate agg = new ConcreteAggregate(); agg.add("aaa"); agg.add("bbb"); agg.add("ccc"); Iterator iter = agg.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } } } ``` 反過頭來在看下 JDK 中的 Iterable 介面。 `java.lang.Iterable` 介面只有一個方法: iterator() ,也就說,通過 iterator() 這個方法去遍歷聚集類中的所有方法或屬性,基本上現在所有的高階語言都有 Iterator 這個介面或者實現, Java 已經把迭代器給我們準備好了,我們再去寫迭代器,就有點多餘了。所以呀,這個迭代器模式也有點沒落了,基本上很少有專案再獨立寫迭代器了,直接使用 Collection 下的實現類就可以完美地解決