Vector, Hashtable 等透過 Enumeration 遍歷ArrayList, HashMap 等透過 Iterator 遍歷舊代碼若直接在新編譯器下編譯會報錯:List 無 elements() 方法。遵循「開閉原則」,不修改舊邏輯前提下複用新集合,需引入適配器模式。
Iterator 適配為 Enumerationpackage net.blogjava.lzqdiy;
import java.util.Enumeration;
import java.util.Iterator;
public class NewEnumeration implements Enumeration {
private final Iterator iterator;
public NewEnumeration(Iterator iterator) {
this.iterator = iterator;
}
@Override
public boolean hasMoreElements() {
return iterator.hasNext();
}
@Override
public Object nextElement() {
return iterator.next();
}
// 測試主程式
public static void main(String[] args) {
List list = new ArrayList();
list.add("a"); list.add("b"); list.add("C");
// 使用舊式 Enumeration 遍歷新集合
for (Enumeration e = new NewEnumeration(list.iterator()); e.hasMoreElements(); ) {
System.out.println(e.nextElement());
}
}
}
| 角色 | 類別/介面 | 說明 |
|---|---|---|
| Target (目標介面) | Enumeration | 舊代碼期望的介面 |
| Adaptee (被適配者) | Iterator | 新集合提供的介面 |
| Adapter (適配器) | NewEnumeration | 實現 Target,組合 Adaptee,轉發請求 |
| Client (客戶端) | main() | 以 Target 介面使用 Adapter |
Java 8+ 可使用 Collections.list(enumeration) 或 Stream API 轉換,但適配器模式在「介面不兼容、不可修改源碼」場景下仍是經典解法。
集合框架從 Enumeration 到 Iterator 的演進,是適配器模式的教科書級應用場景。NewEnumeration 以組合取代繼承,將介面轉換邏輯封裝隔離,完美詮釋「開閉原則」與「依賴倒置原則」。