Android的設計模式-迭代器模式

前言

Android的設計模式系列文章介紹,歡迎關注,持續更新中:

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

1.定義

提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節。

2.介紹

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

3.UML類圖

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

4.實現

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

4.1 創建迭代器接口
    public interface Iterator {

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

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

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

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

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

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

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

實現迭代器接口:

    //快遞迭代類
    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 創建具體容器類

實現容器接口中的功能:

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

        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("后面沒有了");
    }
輸出結果:
當前號碼為:1111
當前號碼為:2222
當前號碼為:3333
當前號碼為:9527
后面沒有了

5. 應用場景

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

6. 優點

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

7. 缺點

  • 會產生多余的對象,消耗內存。
  • 會增多類文件。
  • 遍歷過程是一個單向且不可逆的遍歷。
  • 遍歷過程需要注意容器是否改變,若期間改變了,可能會拋出異常。

8. Android中的源碼分析

除了Java中的Map、List等有用到迭代器模式之外,Android中使用數據庫查詢時返回的Cursor游標對象,實際上就是使用了迭代器模式來實現,首先先讓我們來看下怎么使用Cursor:

8.1 使用Cursor

        Cursor cursor = sqLiteDatabase.query("table", null, null, null, null, null, null);//各種參數請自行查詢用法,這里就不說明了
        if (cursor.moveToFirst()) {//游標指向第一行
            do {
                cursor.getInt(0);//獲得第一列數據
                cursor.getString(1);//獲得第二列數據
            } 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等的源碼,那個更直觀簡單。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容