《Android源碼設計模式》讀書筆記 (14) 第14章 迭代器模式

前言

  • 迭代器模式,又稱爲遊標模式(Cursor);是行爲型設計模式之一.
  • 迭代器模式源於對容器的訪問,比如Java中List\Map\數組等,我們知道對容器對象的訪問必然會涉及遍歷算法,我們可以將遍歷的方法封裝在容器中.在客戶訪問類與容器之間插入了一個第三種–迭代器,很好地解決了上面所述的弊端.
  • 因爲衆多語言內部也有衆多容器體的定義,也有相應的迭代器.因此迭代器模式更多的是瞭解而非應用.

正文

  • 定義:提供一種方法順序訪問一個容器對象中的各個元素,而又不需要暴露該對象的內部表示.
  • 使用場景:遍歷一個容器對象時
  • 優點:支持以不同的方式去遍歷一個容器對象

UML類圖

這裏寫圖片描述

  • Iterator:迭代器接口.負責定義\訪問和遍歷元素的接口
/**
 * 迭代器接口,負責定義\訪問和遍歷元素的接口
 * Created by max on 2016/4/13.
 */
public interface Iterator<T> {
    /**
     * 是否還有下一個元素
     * @return true表示有
     */
    boolean hasNext();

    /**
     * 返回當前位置的元素並將位置移至下一位
     * @return
     */
    T next();
}
  • ConcreteIterator:具體迭代器類,主要是實現迭代器接口,並記錄遍歷的當前位置
/**
 * 具體迭代器類,主要是實現迭代器接口,並記錄遍歷的當前位置
 * Created by max on 2016/4/13.
 */
public class ConcreteIterator<T> implements Iterator<T>{
    private List<T> list = new ArrayList<>();
    private int cursor = 0;

    public ConcreteIterator(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;
    }
}
  • Aggregate:容器接口.負責提供創建具體迭代器角色的接口
/**
 * 容器接口.負責提供創建具體迭代器角色的接口
 * Created by max on 2016/4/13.
 */
public interface Aggregate<T> {
    /**
     * 添加一個元素
     * @param obj 元素
     */
    void add(T obj);

    /**
     * 移除一個元素
     * @param obj
     */
    void remove(T obj);

    /**
     * 獲取容器的迭代器
     * @return 迭代器對象
     */
    Iterator<T> iterator();
}
  • ConcreteAggregate:具體容器類,具體迭代器角色與該容器相關聯.
/**
 * 具體容器類,具體迭代器角色與該容器相關聯
 * Created by max on 2016/4/13.
 */
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<T>(list);
    }
}
  • Client:客戶類
/**
 * 客戶類
 * Created by max on 2016/4/13.
 */
public class Client {

    public static void main(String args[]){
        Aggregate<String> a = new ConcreteAggregate<>();
        a.add("第一個");
        a.add("第二個");
        a.add("第三個");
        a.add("第四個");
        Iterator<String> i = a.iterator();
        //其實這裏就是迭代器遍歷容器的元素,內部還是list實現的
        while(i.hasNext()){
            i.next();
        }
    }

}

總結

  • 源碼下載
發佈了82 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章