Android 迭代器模式

Android 設計模式系列文章 Android 23種設計模式

前言

迭代器模式又稱爲遊標模式,源於對容器的訪問,比如java中的List、Map、數組等,提供一個合理的遍歷訪問。用法就是在用戶訪問類,和容器之間插入一個迭代器,提供遍歷訪問。這樣做可以讓容器功能保持單一,不用在容器內實現遍歷功能。也不用對外提供內部訪問方法導致細節暴露。

迭代器模式定義

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

例子

廢話再多,也不如一個例子來的乾脆。
1、先寫一個迭代器
抽象迭代器方法

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

實現迭代器

public class IteratorImpl<T> implements Iterator<T> {
    private List<T> list = new ArrayList<T>();
    private int cursor = 0;

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

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

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

迭代器核心其實就是給帶入的list提供一個遍歷的方法。
2、寫一個容器
抽象容器方法

public interface Container<T> {
    void add(T obj);
    void remove(T obj);
    Iterator<T> iterator();
}

實現容器

public class ContainerImpl<T> implements Container<T> {
    private List<T> list = new ArrayList<T>();
    @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 IteratorImpl<>(list);
    }
}

我們使用容器的時候,只要提供一個構建迭代器的方法就可以了。迭代器自行對外提供遍歷方法。
3、客戶端調用

        // 創建一個容器
        ContainerImpl<String> containerImpl = new ContainerImpl<>();
        containerImpl.add("jack");
        containerImpl.add("mom");
        containerImpl.add("dad");
        containerImpl.add("john");
        // 根據容器創建一個迭代器
        Iterator<String> iterator = containerImpl.iterator();
        // 迭代器提供遍歷方法,遍歷
        while (iterator.hasNext()) {
            Log.d("Iterator",iterator.next());
        }

log輸出如下:

11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: jack
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: mom
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: dad
11-26 19:01:43.249 28429-28429/com.yink.designpattern.designpattern D/Iterator: john

迭代器模式小結

迭代器模式結構很簡單,就是提供一個list的遍歷方法。目的很明確,弱化遍歷算法和容器之間的關係。其實我們平時開發之中已經很少需要自己去實現迭代器,因爲現在不管是Object,C++,python等等,他們直接實現了這種結構。但是理解這種設計模式也是不錯的。像Android源碼中數據庫中的遊標Cursor也是用的這種結構。

結束語

迭代器模式比較簡單,也沒啥多說的,最後強調迭代器模式記憶要點:根據傳入的list額外提供一個遍歷方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章