17 迭代器模式

定義

迭代器模式(Interator Pattern):提供一種方法順序訪問一個聚合對象中的各個元素,而又不用暴露該對象的內部表示。

結構

  1. Iterator(抽象迭代器):它定義了訪問和遍歷元素的接口,聲明瞭用於遍歷元素的方法,例如用於獲取第一個元素的first()方法、用於訪問下一個元素的next()方法、用於判斷是否還有下一個元素的hasNext()方法、用於獲取當前元素的currentItem()方法等,在具體迭代器中將實現這些方法。
  2. ConcreteInterator(具體迭代器):它實現了抽象迭代器接口,完成對聚合對象的遍歷,同時在具體迭代器中通過遊標來記錄在聚合對象中所在的位置,在具體實現時遊標通常是一個表示位置的非負數。
  3. Aggregate(抽象聚合類):它用於儲存和管理元素對象,聲明一個currentInterator()方法用於創建一個迭代器對象,充當抽象迭代器工廠角色。
  4. ConcreteAggregate(具體聚合類):它是抽象聚合類的子類,實現了在抽象聚合類中聲明的currentInterator()方法,該方法返回一個與具體聚合類對應的具體迭代器ConcreteInterator()實例。

代碼

Interator

public interface Interator<T> {

    void first();
    void next();
    boolean hasNext();
    T currentItem();

}

Aggregate

public interface Aggregate<T> {

    Interator<T> createInterator();

}

ConcreteInterator

/**
* 這裏沒有寫具體實現
*/
public class ConcreteInterator<T> implements Interator<T> {

    // 維持一個具體聚合對象的引用
    private Aggregate<T> aggregate;
    // 定義遊標
    private int cursor;

    public ConcreteInterator(Aggregate<T> aggregate) {
        this.aggregate = aggregate;
    }

    @Override
    public void first() {

    }

    @Override
    public void next() {

    }

    @Override
    public boolean hasNext() {
        return false;
    }

    @Override
    public T currentItem() {
        return null;
    }

}

ConcreteAggregate

public class ConcreteAggregate<T> implements Aggregate<T> {

    @Override
    public Interator<T> createInterator() {
        return new ConcreteInterator<>(this);
    }

}

優/缺點與適用環境

  1. 優點
  • 迭代器模式支持以不同的方式遍歷一個聚合對象。在同一個聚合對象上可以定義多種遍歷方式。在迭代器模式中只需要用個不同的選代器來替換原有選代器即可改變遍歷算法.也可以自己定義迭代器的子類以支持新的遍歷方式。
  • 送代器模式簡化了聚合類,由於引入了迭代器,在原有的聚合對象中不需要再自行提供數據遍歷等方法,這樣可以簡化聚合類的設計。
  • 在這代器模式中由於引入了抽象層,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足開閉原則。
  1. 缺點
  • 由於迭代器模式將存儲數據和遍歷數據的職責分離,在增加新的聚合類時需要對應增加新的迭代器類.類的個數成對增加,這在一定程度 上增加了系統的複雜性。
  • 抽象迭代器的設計難度較大,需要充分考慮到系統將來的擴展。在自定義迭代器時創建一個考慮全面的抽象迭代器並不是一件很容易的事情。
  1. 適用環境
  • 訪問一個聚合對象的內容而無須暴露它的內部表示。將聚合對象的訪問與內部數據的存儲分離,使得訪問聚合對象時無須瞭解其內部實現細節。
  • 需要爲一個聚合對象提供多種遍歷方式。
  • 爲遍歷不同的聚合結構提供一個統一的接口,在該接口的實現類中爲不同的聚合結構提供不同的遍歷方式,而客戶端可以一致性地操作該接口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章