Android的設(shè)計模式-迭代器模式

前言

Android的設(shè)計模式系列文章介紹报慕,歡迎關(guān)注,持續(xù)更新中:

Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式

1.定義

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

2.介紹

  • 迭代器模式屬于行為型模式钞支。
  • 迭代器(Iterator)模式郊楣,又叫做游標(Cursor)模式。
  • Java中的Map摔刁、List等等容器挥转,都使用到了迭代器模式。

3.UML類圖

迭代器模式UML類圖.jpg
角色說明:
  • Iterator(迭代器接口):負責定義共屈、訪問和遍歷元素的接口绑谣。
  • ConcreteIterator(具體迭代器類):實現(xiàn)迭代器接口。
  • Aggregate(容器接口):定義容器的基本功能以及提供創(chuàng)建迭代器的接口拗引。
  • ConcreteAggregate(具體容器類):實現(xiàn)容器接口中的功能借宵。
  • Client(客戶端類):即要使用迭代器模式的地方。

4.實現(xiàn)

繼續(xù)以快遞舉例子矾削,貨架上有很多快遞包壤玫,取快遞時我們報出手機號,然后快遞小哥就遍歷貨架上所有的快遞信息哼凯,直到找出快遞包為止:

4.1 創(chuàng)建迭代器接口
    public interface Iterator {

        boolean hasNext();    //是否存在下一條記錄

        Object next();        //返回當前記錄并移到下一條記錄
    }
4.2 創(chuàng)建容器接口

定義容器的基本功能以及提供創(chuàng)建迭代器的接口:

     public interface Aggregate {
      
        int size();//容器大小

        String get(int location);//獲取獲取中指定位置的號碼

        void add(String tel);//添加號碼到容器中

        void remove(String tel);//從容器中移除號碼
        
        Iterator iterator();//返回容器的迭代器
    }
4.3 創(chuàng)建具體迭代器類

實現(xiàn)迭代器接口:

    //快遞迭代類
    public class DeliveryIterator implements Iterator {
        private Aggregate aggregate;//容器對象
        private int index;//當前索引

        public DeliveryIterator(Aggregate aggregate) {
            this.aggregate = aggregate;//初始化容器對象
        }

        @Override
        public boolean hasNext() {//是否存在下一條記錄
            if (index < aggregate.size()) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public Object next() {//返回當前記錄并移到下一條記錄
            return aggregate.get(index++);
        }
    }
4.4 創(chuàng)建具體容器類

實現(xiàn)容器接口中的功能:

    //快遞容器類
    public class DeliveryAggregate implements Aggregate {
        private List<String> list = new ArrayList<>();//內(nèi)部使用list來存儲數(shù)據(jù)

        public int size() {//容器大小
            return list.size();
        }

        public String get(int location) {
            return list.get(location);
        }

        public void add(String tel) {
            list.add(tel);
        }

        public void remove(String tel) {
            list.remove(tel);
        }

        @Override
        public Iterator iterator() {////返回迭代器
            return new DeliveryIterator(this);
        }
    }
4.5 客戶端測試
     public void test() {
        Aggregate aggregate=new DeliveryAggregate();
        aggregate.add("1111");
        aggregate.add("2222");
        aggregate.add("3333");
        aggregate.add("9527");

        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()){
            String tel = (String) iterator.next();
            System.out.println("當前號碼為:"+tel);
        }
        System.out.println("后面沒有了");
    }
輸出結(jié)果:
當前號碼為:1111
當前號碼為:2222
當前號碼為:3333
當前號碼為:9527
后面沒有了

5. 應(yīng)用場景

  • 遍歷一個容器對象時欲间。
  • 實際我們開發(fā)中很少使用到迭代器模式。雖然不怎么用得到断部,但是了解其原理能夠讓我們在看到相關(guān)的源碼(如Java中的Map括改、List等等容器)時能夠更容易了解源碼的相關(guān)思想。

6. 優(yōu)點

  • 可以支持以不同的方式去遍歷容器對象家坎,如順序遍歷,逆序遍歷等等吝梅。
  • 符合單一職責原則虱疏,容器類與遍歷算法的分離,不同類負責不同的功能苏携。

7. 缺點

  • 會產(chǎn)生多余的對象做瞪,消耗內(nèi)存。
  • 會增多類文件。
  • 遍歷過程是一個單向且不可逆的遍歷装蓬。
  • 遍歷過程需要注意容器是否改變著拭,若期間改變了,可能會拋出異常牍帚。

8. Android中的源碼分析

除了Java中的Map儡遮、List等有用到迭代器模式之外,Android中使用數(shù)據(jù)庫查詢時返回的Cursor游標對象暗赶,實際上就是使用了迭代器模式來實現(xiàn)鄙币,首先先讓我們來看下怎么使用Cursor:

8.1 使用Cursor

        Cursor cursor = sqLiteDatabase.query("table", null, null, null, null, null, null);//各種參數(shù)請自行查詢用法,這里就不說明了
        if (cursor.moveToFirst()) {//游標指向第一行
            do {
                cursor.getInt(0);//獲得第一列數(shù)據(jù)
                cursor.getString(1);//獲得第二列數(shù)據(jù)
            } while (cursor.moveToNext());//移到下一行
        }

8.2 Cursor源碼

//Cursor是一個接口蹂随,實際上就是迭代器接口
public interface Cursor extends Closeable {
    //其他代碼略
    boolean moveToFirst();
    int getInt(int columnIndex);
    String getString(int columnIndex);
    boolean moveToNext();
}

從上面代碼可以看出Cursor游標實際上就是個迭代器十嘿。

8.3 其他

有興趣的可以去看下Java中的Map、List等的源碼岳锁,那個更直觀簡單绩衷。

相關(guān)文章閱讀
Android的設(shè)計模式-設(shè)計模式的六大原則
一句話總結(jié)23種設(shè)計模式則
創(chuàng)建型模式:
Android的設(shè)計模式-單例模式
Android的設(shè)計模式-建造者模式
Android的設(shè)計模式-工廠方法模式
Android的設(shè)計模式-簡單工廠模式
Android的設(shè)計模式-抽象工廠模式
Android的設(shè)計模式-原型模式
行為型模式:
Android的設(shè)計模式-策略模式
Android的設(shè)計模式-狀態(tài)模式
Android的設(shè)計模式-責任鏈模式
Android的設(shè)計模式-觀察者模式
Android的設(shè)計模式-模板方法模式
Android的設(shè)計模式-迭代器模式
Android的設(shè)計模式-備忘錄模式
Android的設(shè)計模式-訪問者模式
Android的設(shè)計模式-中介者模式
Android的設(shè)計模式-解釋器模式
Android的設(shè)計模式-命令模式
結(jié)構(gòu)型模式:
Android的設(shè)計模式-代理模式
Android的設(shè)計模式-組合模式
Android的設(shè)計模式-適配器模式
Android的設(shè)計模式-裝飾者模式
Android的設(shè)計模式-享元模式
Android的設(shè)計模式-外觀模式
Android的設(shè)計模式-橋接模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市激率,隨后出現(xiàn)的幾起案子咳燕,更是在濱河造成了極大的恐慌,老刑警劉巖柱搜,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟郎,死亡現(xiàn)場離奇詭異,居然都是意外死亡聪蘸,警方通過查閱死者的電腦和手機宪肖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來健爬,“玉大人控乾,你說我怎么就攤上這事∧茸瘢” “怎么了蜕衡?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長设拟。 經(jīng)常有香客問我慨仿,道長,這世上最難降的妖魔是什么纳胧? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任镰吆,我火速辦了婚禮,結(jié)果婚禮上跑慕,老公的妹妹穿的比我還像新娘万皿。我一直安慰自己摧找,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布牢硅。 她就那樣靜靜地躺著蹬耘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪减余。 梳的紋絲不亂的頭發(fā)上综苔,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音佳励,去河邊找鬼休里。 笑死,一個胖子當著我的面吹牛赃承,可吹牛的內(nèi)容都是我干的妙黍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瞧剖,長吁一口氣:“原來是場噩夢啊……” “哼拭嫁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抓于,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤做粤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捉撮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怕品,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年巾遭,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉康。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡灼舍,死狀恐怖吼和,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骑素,我是刑警寧澤炫乓,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站献丑,受9級特大地震影響末捣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜创橄,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一塔粒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筐摘,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馍管,卻和暖如春郭赐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背确沸。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工捌锭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罗捎。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓观谦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桨菜。 傳聞我的和親對象是個殘疾皇子豁状,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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