Android 架構師之路16 設計模式之迭代器模式

Android 架構師之路 目錄

1、迭代器模式概念

1.1 介紹

迭代器模式(Iterator Pattern)又稱為游標(Cursor)模式,是行為型設計模式之一。
源于對容器的訪問,比如java中的list,Map,數(shù)組等,我們知道對容器對象的訪問必然是多種多樣的,所以我們把遍歷的方法封裝在容器中,或者不提供遍歷方法。

1.2 定義

提供一種方法順序訪問一個容器對象中的各個元素,而又不需要暴露該對象的內(nèi)部表示。

1.3 使用場景
  • 訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示

  • 支持對聚合對象的多種遍歷

  • 為遍歷不同的聚合結構提供一個統(tǒng)一的接口

2、迭代器模式UML類圖

迭代器模式UML類圖

角色如下:

  • Iterator(迭代器):迭代器定義訪問和遍歷元素的接口

  • ConcreteIterator (具體迭代器):具體迭代器實現(xiàn)迭代器接口,對該聚合遍歷時跟蹤當前位置

  • Aggregate (聚合):聚合定義創(chuàng)建相應迭代器對象的接口

  • ConcreteAggregate (具體聚合):具體聚合實現(xiàn)創(chuàng)建相應迭代器的接口,該操作返回ConcreteIterator的一個適當?shù)膶嵗?/p>

3、迭代器模式實現(xiàn)

Iterator:
/**
*抽象迭代接口
*/
public interface Iterator <T>{

    /**
     * 是否有下一元素
     * @return
     */
    boolean hasNext();

    T next();
}
ConcreteItertor:
/**
 * 具體的迭代角色
 */
public class ConcreteItertor<T> implements Iterator<T>{
    public ConcreteItertor(List<T> list) {
        this.list = list;
    }
    private List<T> list = new ArrayList<>();
    private int cursor = 0;
    @Override
    public boolean hasNext() {
        return cursor!=list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if(this.hasNext()){
            obj = list.get(cursor++);
        }
        return obj;
    }
}
Aggregate:
/**
 * 容器的接口
 */
public interface Aggregate<T> {
    void add(T t);

    void remove(T t);

    Iterator<T> iterator();
}

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

    private List<T> list = new ArrayList<>();
    @Override
    public void add(T t) {
      list.add(t);
    }

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

    @Override
    public Iterator<T> iterator() {
        return new ConcreteItertor<>(list);
    }
}
Client:
public class Client {
    public static void main(String[] args){
        //實例化容器類對象
        Aggregate<String> aggregate = new ConcreteAggregate<>();
        aggregate.add("aaaa");
        aggregate.add("bbbb");
        aggregate.add("cccc");
        Iterator<String> iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

結果輸出:

aaaa
bbbb
cccc

4、Android源碼中的模式實現(xiàn)

1.除了各種數(shù)據(jù)結構體,如List,Map等包含的迭代器外
2.Android自身源碼中也為我們提供了迭代器遍歷數(shù)據(jù),最為典型的例子就是數(shù)據(jù)庫查詢使用Cursor(當我們使用SQLiteDatabase的query方法查詢數(shù)據(jù)庫時返回的),該游標對象實質(zhì)就是一個具體的迭代器,我們可以使用它來遍歷數(shù)據(jù)庫查詢所得的結果集

5、模式總結

5.1 優(yōu)點
  • 它支持以不同的方式遍歷一個聚合對象。
  • 迭代器簡化了聚合類。
  • 在同一個聚合上可以有多個遍歷。
  • 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼。
5.2 缺點
  • 由于迭代器模式將存儲數(shù)據(jù)和遍歷數(shù)據(jù)的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復雜性。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容