設計模式 - 迭代器模式詳解及其在ArrayList中的應用

農夫三拳有點疼~發表於2020-04-30

基本介紹

迭代器模式(Iterator Pattern)是 Java 中使用最多的一種模式,它可以順序的訪問容器中的元素,但不需要知道容器的內部細節

模式結構

Iterator(抽象迭代器):定義遍歷元素所需的基本方法

ConcreteIterator(具體迭代器):根據自己的需求實現抽象方法,完成迭代

Aggregate(抽象容器):定義對容器的基本操作

ConcreteAggregate(具體容器):抽象容器的具體實現類,iterator方法返回一個具體的迭代器

舉例說明

使用迭代器模式實現對資料的遍歷

抽象迭代器

public interface Iterator<T> {
    boolean hasNext();
    T next();
}

具體迭代器

public class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list; //遍歷的集合
    private int index = -1; //遍歷的索引

    public ConcreteIterator(List<T> list) {
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return index < list.size() - 1;
    }

    @Override
    public T next() {
        T t = null;
        if (this.hasNext()) {
            t = list.get(++index);
        }
        return t;
    }
}

抽象容器

public interface Aggregate<T> {
    void add(T t);

    void remove(T t);

    Iterator<T> iterator();
}

具體容器

public class ConcreteAggregate<T> implements Aggregate<T> {
    private List<T> list = new ArrayList<>();

    @Override
    public void add(T obj) {
        list.add(obj);
    }

    @Override
    public void remove(T obj) {
        list.remove(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<>(list);
    }
}

測試類

public class Client {
    @Test
    public void test() {
        Aggregate<String> aggregate = new ConcreteAggregate<>();
        aggregate.add("張三");
        aggregate.add("李四");
        aggregate.add("王五");
        Iterator<String> iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

執行結果

張三
李四
王五

模式分析

優點:

  • 提供一種統一的遍歷方式,使用者不需要再考慮聚合的型別,使用一種方式就可以遍歷
  • 隱藏了聚合物件內部的細節,客戶端遍歷的時候取到的是迭代器物件,不會知道聚合的具體組成
  • 符合單一職責原則,把管理物件集合和遍歷物件集合的責任分開,這樣一來,集合改變只會影響到聚合物件,遍歷方式改變只會影響到迭代器物件

缺點:

  • 每個聚合物件都需要一個迭代器,類的個數成對增加,增加了系統的複雜性

適用場景:

  • 當要展示一組相似物件,遍歷一組相同物件時使用

在 ArrayList 中的應用

Java 中的容器物件有很多,基本都涉及到迭代器,我們以 ArrayList 作為例子,剖析它是如何應用迭代器模式的。

開啟 ArrayList 原始碼可以發現:

  • ArrayList 實現了 List 介面,使用 Object 陣列儲存元素
  • 在 List 介面中定義了 iterator() 以及很多對操作集合的方法
  • 在 ArrayList 中對 iterator() 進行了重寫,並返回一個 Itr 物件
  • Itr 是 ArrayList 的內部類,並且實現了 Iterator 介面

綜上,其基本關係就是:

當然,List 下的實現類不止 ArrayList,Iterator 下也有許多具體迭代器,它們各自有各自的實現方式,共同構建了 Java 中強大的容器類。

(完)

相關文章