【設計模式In Java】十五、迭代器模式

迭代器模式

定義

迭代器模式(Iterator Pattern):提供一種方法來訪問聚合對象,而不用暴露這個對象的內部表示,其別名爲遊標(Cursor)。迭代器模式是一種對象行爲型模式。

場景

Java集合遍歷幾乎都支持迭代器模式,一切聚合對象的遍歷都可以使用迭代器模式,這裏用ListIterator舉例。

UML類圖

在這裏插入圖片描述

代碼

iterator

示例:

public class TestIterator {

    @Test
    public void test() {
        MyList<String> myList = new MyList<>();
        myList.add("a");
        myList.add("b");
        myList.add("c");
        myList.add("d");

        Iterator<String> iterator = new MyIterator<>(myList);
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

}

總結

JDK已經默認實現了迭代器,平常開發中的使用頻率還是非常高的,如果要實現一個聚集對象的迭代器,直接實現Iterable接口即可。

迭代器模式的主要優點如下:

  • 它支持以不同的方式遍歷一個聚合對象,在同一個聚合對象上可以定義多種遍歷方式。在迭代器模式中只需要用一個不同的迭代器來替換原有迭代器即可改變遍歷算法,我們也可以自己定義迭代器的子類以支持新的遍歷方式。
  • 迭代器簡化了聚合類。由於引入了迭代器,在原有的聚合對象中不需要再自行提供數據遍歷等方法,這樣可以簡化聚合類的設計。
  • 在迭代器模式中,由於引入了抽象層,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足“開閉原則”的要求。

迭代器模式的主要缺點如下:

  • 由於迭代器模式將存儲數據和遍歷數據的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
  • 抽象迭代器的設計難度較大,需要充分考慮到系統將來的擴展,例如JDK內置迭代器Iterator就無法實現逆向遍歷,如果需要實現逆向遍歷,只能通過其子類ListIterator等來實現,而ListIterator迭代器無法用於操作Set類型的聚合對象。在自定義迭代器時,創建一個考慮全面的抽象迭代器並不是件很容易的事情。

在以下情況下可以考慮使用迭代器模式:

  • 訪問一個聚合對象的內容而無須暴露它的內部表示。將聚合對象的訪問與內部數據的存儲分離,使得訪問聚合對象時無須瞭解其內部實現細節。
  • 需要爲一個聚合對象提供多種遍歷方式。
  • 爲遍歷不同的聚合結構提供一個統一的接口,在該接口的實現類中爲不同的聚合結構提供不同的遍歷方式,而客戶端可以一致性地操作該接口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章