簡易理解設(shè)計模式之:迭代器模式——遍歷對象的好幫手

介紹:

迭代器模式屬于行為型模式弄屡。它提供一種方法順序訪問一個聚合對象中各個元素泞边,而又不暴露該對象的內(nèi)部表示吞加。

類圖:

迭代器模式UML類圖.png

Iterator(迭代器接口):定義勺卢、訪問和遍歷元素的接口
ConcreteIterator(具體迭代器類):實現(xiàn)迭代器接口伙判,并記錄遍歷的當(dāng)前位置
Aggregate(容器接口):提供創(chuàng)建具體迭代器角色的接口
ConcreteAggregate(具體容器類):實現(xiàn)容器接口功能

用法:

? 遍歷一個集合對象的時候

個人理解:
這個模式比較古老,很多語言也會自帶這種模式黑忱,比如Java中的List宴抚、Map、數(shù)組等也已經(jīng)封裝了這種方法了甫煞。實際開發(fā)中我們已經(jīng)不會再使用這個模式了菇曲。for循環(huán)、foreach循環(huán)已經(jīng)很滿足我們的開發(fā)需求了抚吠。

例子:

這種模式的學(xué)習(xí)價值還是很高的羊娃,我們就過一遍如何使用這個模式。

需求:實現(xiàn)迭代器

1埃跷、定義Iterator接口

public interface Iterator<T> {
    //是否有下一個元素
    boolean hasNext();

    //返回當(dāng)前位置元素并將位置移到下一位
    T next();
}

此接口用于統(tǒng)一業(yè)務(wù)層的抽象方法蕊玷。幫助集合對象遍歷的時候不暴露該對象的內(nèi)部表示。

2弥雹、實現(xiàn)ConcreteIterator類

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;
    }
}

為了方便操作垃帅,我們集合對象的數(shù)組用List表示,原則上是用Object[]剪勿。在Iterator接口中的方法贸诚,遍歷時業(yè)務(wù)層只關(guān)注:有沒有后面一個hasNext()、獲得的元素是什么next(),而具體實現(xiàn)的細(xì)節(jié)就是Iterator做好了酱固。

3械念、定義Aggregate接口

public interface Aggregate<T> {
    void add(T obj);
    void remove(T obj);
    Iterator<T> iterator();
}

此接口創(chuàng)建迭代器,并為集合中的元素對象提供操作方法运悲。

4龄减、實現(xiàn)ConcreteAggregate類

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);
    }
}

Aggregate的核心就是創(chuàng)建一個迭代器,把組裝好的數(shù)據(jù)交給迭代器去遍歷班眯。

5希停、測試與運行結(jié)果

public class Test {
    public static void main(String[] args) {
        Aggregate<String> a = new ConcreteAggregate<>();
        a.add("A");
        a.add("B");
        a.add("C");
        a.add("D");
        Iterator<String> i = a.iterator();
        while (i.hasNext()){
            System.out.println(i.next());
        }
    }
}

運行結(jié)果:

A
B
C
D

總結(jié):

迭代器模式分離了對象的遍歷行為,抽象出一個迭代器類來負(fù)責(zé)署隘,這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu)宠能,又可以讓外部代碼透明地訪問集合內(nèi)部數(shù)據(jù)。

感謝您的閱讀~

轉(zhuǎn)載請注明出處喔:http://www.reibang.com/p/27cfcdfb776c

推薦閱讀

基礎(chǔ)篇:
設(shè)計模式前篇之——UML類圖必會知識點
設(shè)計模式前篇之——一起過一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡易理解設(shè)計模式之:簡單工廠模式——來試試接入支付功能
簡易理解設(shè)計模式之:工廠方法模式——數(shù)據(jù)存儲例子
簡易理解設(shè)計模式之:抽象工廠模式——更換數(shù)據(jù)庫例子
簡易理解設(shè)計模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡易理解設(shè)計模式之:原型模式——深磁餐、淺拷貝的概念
簡易理解設(shè)計模式之:單例模式——單例模式的幾種常用寫法
結(jié)構(gòu)型模式:
簡易理解設(shè)計模式之:適配器模式——Android列表視圖控件設(shè)計方式
簡易理解設(shè)計模式之:橋接模式——穿衣服經(jīng)典案例2
簡易理解設(shè)計模式之:組合模式——實現(xiàn)View中的樹狀結(jié)構(gòu)
簡易理解設(shè)計模式之:裝飾模式——穿衣服經(jīng)典案例
簡易理解設(shè)計模式之:外觀模式——第三方SDK的幫助類
簡易理解設(shè)計模式之:享元模式——五子棋游戲例子
簡易理解設(shè)計模式之:代理模式——iOS視圖控件設(shè)計方式
行為型模式:
簡易理解設(shè)計模式之:策略模式——優(yōu)化一下支付功能
簡易理解設(shè)計模式之:模板方法模式——Android中的BaseActivity基類
簡易理解設(shè)計模式之:觀察者模式——監(jiān)聽與回調(diào)
簡易理解設(shè)計模式之:狀態(tài)模式——優(yōu)化登錄操作
簡易理解設(shè)計模式之:備忘錄模式——Word文檔的工作原理
簡易理解設(shè)計模式之:迭代器模式——遍歷對象的好幫手
簡易理解設(shè)計模式之:命令模式——實現(xiàn)命令的參數(shù)化配置
簡易理解設(shè)計模式之:責(zé)任鏈模式——OA中請假流程示例
簡易理解設(shè)計模式之:中介者模式——多人聊天室例子
簡易理解設(shè)計模式之:解釋器模式——語言和文法
簡易理解設(shè)計模式之:訪問者模式——員工考核例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末违崇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诊霹,更是在濱河造成了極大的恐慌亦歉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畅哑,死亡現(xiàn)場離奇詭異肴楷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荠呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門赛蔫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泥张,你說我怎么就攤上這事呵恢。” “怎么了媚创?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵渗钉,是天一觀的道長。 經(jīng)常有香客問我钞钙,道長鳄橘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任芒炼,我火速辦了婚禮瘫怜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘本刽。我一直安慰自己鲸湃,他們只是感情好挨务,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布灭美。 她就那樣靜靜地躺著,像睡著了一般防嗡。 火紅的嫁衣襯著肌膚如雪拙吉。 梳的紋絲不亂的頭發(fā)上补鼻,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天娜搂,我揣著相機(jī)與錄音庇麦,去河邊找鬼。 笑死晒衩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墙歪。 我是一名探鬼主播听系,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虹菲!你這毒婦竟也來了靠胜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤毕源,失蹤者是張志新(化名)和其女友劉穎浪漠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霎褐,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡址愿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冻璃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响谓。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖省艳,靈堂內(nèi)的尸體忽然破棺而出娘纷,到底是詐尸還是另有隱情,我是刑警寧澤跋炕,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布赖晶,位于F島的核電站,受9級特大地震影響辐烂,放射性物質(zhì)發(fā)生泄漏遏插。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一纠修、第九天 我趴在偏房一處隱蔽的房頂上張望涩堤。 院中可真熱鬧,春花似錦分瘾、人聲如沸胎围。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白魂。三九已至汽纤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間福荸,已是汗流浹背蕴坪。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留敬锐,地道東北人背传。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像台夺,于是被迫代替她去往敵國和親径玖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354