首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

設計模式精講:迭代器模式——統一遍歷接口,屏蔽容器差異

     編輯:Java 相關知識

迭代器模式提供一種方法順序訪問聚合對象中的各個元素,而無需暴露該對象的內部表示。它是 Java 集合框架的基石,Collection.iterator() 正是其標準實踐。

一、 四大角色與職責

  • 抽象容器:定義 iterator() 方法,如 Collection、List、Set。
  • 具體容器:實現容器接口,如 ArrayList、HashSet、LinkedList。
  • 抽象迭代器:定義遍歷操作:hasNext()、next()、remove()。
  • 具體迭代器:實現遍歷邏輯,維護游標位置,封裝容器內部結構。

二、 從零手寫一個迭代器

interface Iterator { Object next(); boolean hasNext(); }
interface Aggregate { void add(Object o); void remove(Object o); Iterator iterator(); }

class ConcreteAggregate implements Aggregate {
    private List<Object> list = new ArrayList<>();
    public void add(Object o) { list.add(o); }
    public void remove(Object o) { list.remove(o); }
    public Iterator iterator() { return new ConcreteIterator(list); }
}

class ConcreteIterator implements Iterator {
    private List<Object> list; private int cursor = 0;
    public ConcreteIterator(List<Object> list) { this.list = list; }
    public boolean hasNext() { return cursor < list.size(); }
    public Object next() { return hasNext() ? list.get(cursor++) : null; }
}

三、 多種遍歷策略的靈活支援

容器可提供不同迭代器實現:正序、逆序、過濾、分頁等,客戶端無感知切換:

// 逆序迭代器示例
class ReverseIterator implements Iterator {
    private List<Object> list; private int index;
    public ReverseIterator(List<Object> list) { this.list = list; index = list.size()-1; }
    public boolean hasNext() { return index >= 0; }
    public Object next() { return hasNext() ? list.get(index--) : null; }
}

四、 優缺點與工程建議

優點缺點
統一遍歷接口,屏蔽底層數據結構差異簡單數組/列表用 for 循環更直觀高效
支援多種遍歷策略,擴展性強引入額外類增加系統複雜度
封裝性好,符合單一職責原則并發修改時需額外機制保證安全

現代 Java 開發建議:優先使用語言內建迭代器(for-each、Stream API),僅在實現自定義容器或特殊遍歷邏輯時手寫迭代器。

五、 總結

迭代器模式將「如何遍歷」從「數據結構」中分離,是集合框架設計的經典範例。理解其原理有助於深入掌握 Java 集合源碼,並在需要自定義遍歷時做出正確設計決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved