Android設計模式(十三)-迭代器模式

迭代器模式又稱游標模式躏将,也是行為型設計模式。源于對容器的訪問考蕾,主要解決容器的遍歷操作耸携。

我們隊容器的訪問必然會用到遍歷。我們可以將遍歷的方法封裝到容器中辕翰,或者不提供遍歷方法夺衍。如果封裝在容器中,容器就承擔了過多的功能喜命。如果不提供遍歷方法沟沙,使用者會自己去實現(xiàn)遍歷方法,讓容器內(nèi)部細節(jié)暴露無遺壁榕。

因此在訪問類和容器之間加上了第三者--迭代器矛紫。

博客地址

定義

提供一種方法訪問一個容器對象中各個元素,而又不暴露該對象的內(nèi)部細節(jié)牌里。

使用場景

  • 遍歷一個容器對象時颊咬。

UML

  • Iterator : 迭代器接口,負責定義牡辽、訪問喳篇、遍歷元素的接口。
  • ConcreteIterator:具體的迭代類态辛,實現(xiàn)迭代器接口麸澜,并記錄遍歷的當前位置。
  • Aggregate:容器接口奏黑,負責提供創(chuàng)建具體迭代器的接口炊邦。
  • ConcreteAggregate:具體容器類,和具體迭代器相關(guān)聯(lián)熟史。

模板代碼

抽象的迭代器

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

具體的迭代器

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 = list.get(cursor++);
        }
        return obj;
    }
}

抽象的容器

public interface Aggregate<T> {
    void add(T obj);
    void remove(T obj);
    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);
    }
}

客戶端調(diào)用

public class Client {
    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("a");
        aggregate.add("r");
        aggregate.add("f");
        aggregate.add("w");
        aggregate.add("e");
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

輸出

簡單實現(xiàn)

可以直接用上面的模板代碼馁害,集合是泛型,存什么都可以蹂匹。因為迭代器就是用來遍歷的碘菜。

Android中的迭代器模式

其實在上面的例子中用List來存儲本來就是不合適的。因為Java本身提供的容器都已經(jīng)提供了相應的迭代器。所以在開發(fā)中炉媒,我們基本不需要親自去實現(xiàn)踪区。

Android中的迭代器例子有一個是SQLite數(shù)據(jù)庫的查詢了。

SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READWRITE);
Cursor cursor = db.rawQuery("select * from android_basic , 15",null);

返回的是一個Cursor對象吊骤,這個對象實質(zhì)是其實就是個迭代器缎岗。看看他的用法白粉。

while (cursor.moveToNext()){//遍歷讀取數(shù)據(jù)
            ......
}

總結(jié)

迭代器就是把容器中遍歷對象的功能提取出來传泊,這樣既不暴露容器的細節(jié),又可以讓外部訪問容器內(nèi)部的內(nèi)容鸭巴。

優(yōu)點

  • 支持不同的方式去遍歷一個容器眷细,也可以有多個遍歷,弱化了容器和遍歷算法之間的關(guān)系鹃祖。
  • 不用用戶自己去實現(xiàn)遍歷功能溪椎,也分離了容器和遍歷算法,避免了容器承擔過多功能恬口。
  • 封裝性更好校读,方便修改遍歷算法而不用修改容器。

缺點

  • 類文件會增加祖能,所以對于簡單的遍歷來說不是很重要歉秫。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市养铸,隨后出現(xiàn)的幾起案子雁芙,更是在濱河造成了極大的恐慌,老刑警劉巖钞螟,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔甘,死亡現(xiàn)場離奇詭異,居然都是意外死亡筛圆,警方通過查閱死者的電腦和手機裂明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門椿浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來太援,“玉大人,你說我怎么就攤上這事扳碍√岵恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵笋敞,是天一觀的道長碱蒙。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么赛惩? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任哀墓,我火速辦了婚禮,結(jié)果婚禮上喷兼,老公的妹妹穿的比我還像新娘篮绰。我一直安慰自己,他們只是感情好季惯,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布吠各。 她就那樣靜靜地躺著,像睡著了一般勉抓。 火紅的嫁衣襯著肌膚如雪贾漏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天藕筋,我揣著相機與錄音纵散,去河邊找鬼。 笑死隐圾,一個胖子當著我的面吹牛困食,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翎承,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硕盹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叨咖?” 一聲冷哼從身側(cè)響起瘩例,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甸各,沒想到半個月后垛贤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡趣倾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年聘惦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒恋。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡善绎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫尽,到底是詐尸還是另有隱情禀酱,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布牧嫉,位于F島的核電站剂跟,受9級特大地震影響减途,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曹洽,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一鳍置、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧送淆,春花似錦墓捻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至环凿,卻和暖如春梧兼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背智听。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工羽杰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人到推。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓考赛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莉测。 傳聞我的和親對象是個殘疾皇子颜骤,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容