在 Java 開發中,Iterator(迭代器)模式 是一種行為型設計模式,它提供了一種統一的方式來遍歷集合中的元素,而無需暴露集合的內部結構。本文將透過完整的程式碼範例,從介面定義到實際應用,深入解析 Iterator 模式的核心概念與實作細節。
首先定義一個頂層的集合介面,規範基本操作:新增元素、取得大小、以及建立迭代器。
package com.example.iterator;
public interface Collection {
void add(Object o);
int size();
Iterator iterator();
}
迭代器介面只需兩個核心方法:hasNext() 判斷是否有下一個元素,next() 取得下一個元素。
package com.example.iterator;
public interface Iterator {
Object next();
boolean hasNext();
}
我們實作一個簡易的動態陣列 ArrayList,內部維護一個 Object[] 並自動擴容。關鍵在於 iterator() 方法回傳一個內部類 ArrayListIterator,封裝遍歷狀態(currentIndex)。
package com.example.iterator;
public class ArrayList implements Collection {
private Object[] objects = new Object[10];
private int index = 0;
@Override
public void add(Object o) {
if (index == objects.length) {
Object[] newObjects = new Object[objects.length * 2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects;
}
objects[index++] = o;
}
@Override
public int size() {
return index;
}
@Override
public Iterator iterator() {
return new ArrayListIterator();
}
/** 內部迭代器實作 */
private class ArrayListIterator implements Iterator {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < index;
}
@Override
public Object next() {
return objects[currentIndex++];
}
}
}
客戶端程式只需依賴介面,即可透過多態機制遍歷集合,完全不需知道底層是陣列還是鏈表。
package com.example.iterator;
public class TestMain {
public static void main(String[] args) {
Collection c = new ArrayList();
for (int i = 0; i < 15; i++) {
c.add("string " + i);
}
System.out.println("集合大小:" + c.size());
Iterator it = c.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
集合大小:15
string 0
string 1
...
string 14
此例完美展示了面向介面程式設計與多態的威力:
Collection 和 Iterator 介面程式設計ArrayList)封裝內部資料結構LinkedList、HashSet 等實作,客戶端代碼零修改這就是 Iterator 模式的核心價值:提供統一的遍歷介面,屏蔽底層資料結構差異。