Java設(shè)計(jì)模式—迭代器模式

迭代器模式(Iterator Pattern)是 Java 編程環(huán)境中非常常用的設(shè)計(jì)模式。這種模式用于順序訪問(wèn)集合對(duì)象的元素攀唯,不需要知道集合對(duì)象的底層表示洁桌。
迭代器模式屬于行為型模式。

一侯嘀、介紹

意圖:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素, 而又無(wú)須暴露該對(duì)象的內(nèi)部表示另凌。
主要解決:不同的方式來(lái)遍歷整個(gè)整合對(duì)象。
何時(shí)使用:遍歷一個(gè)聚合對(duì)象戒幔。
如何解決:把在元素之間游走的責(zé)任交給迭代器吠谢,而不是聚合對(duì)象。
關(guān)鍵代碼:定義接口:hasNext, next诗茎。
應(yīng)用實(shí)例:JAVA 中的 iterator工坊。
優(yōu)點(diǎn): 1、它支持以不同的方式遍歷一個(gè)聚合對(duì)象敢订。 2王污、迭代器簡(jiǎn)化了聚合類(lèi)。 3楚午、在同一個(gè)聚合上可以有多個(gè)遍歷昭齐。 4、在迭代器模式中矾柜,增加新的聚合類(lèi)和迭代器類(lèi)都很方便阱驾,無(wú)須修改原有代碼。
缺點(diǎn):由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離怪蔑,增加新的聚合類(lèi)需要對(duì)應(yīng)增加新的迭代器類(lèi)里覆,類(lèi)的個(gè)數(shù)成對(duì)增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性缆瓣。
使用場(chǎng)景: 1喧枷、訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)須暴露它的內(nèi)部表示。 2、需要為聚合對(duì)象提供多種遍歷方式割去。 3窟却、為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口昼丑。
注意事項(xiàng):迭代器模式就是分離了集合對(duì)象的遍歷行為呻逆,抽象出一個(gè)迭代器類(lèi)來(lái)負(fù)責(zé)峭判,這樣既可以做到不暴露集合的內(nèi)部結(jié)構(gòu)费就,又可讓外部代碼透明地訪問(wèn)集合內(nèi)部的數(shù)據(jù)。

二歪赢、代碼實(shí)現(xiàn)

1呼奢、迭代器接口

/**
 * 迭代器接口
 */
interface Iterator {
 /**
 * 迭代器接口
 */
interface Iterator {
    /**
     * 獲取第一個(gè)元素
     */
    Object first();

    /**
     * 讀取下一個(gè)元素
     */
    Object next();

    /**
     * 是否還有元素
     */
    boolean hasNext();

    /**
     * 獲取當(dāng)前元素
     */
    Object currentItem();
}

2宜雀、實(shí)現(xiàn)迭代器

/**
 * 實(shí)現(xiàn)迭代器
 */
public class ConcreteIterator implements Iterator {
    private int current;
    private Container container;

    public ConcreteIterator(Container container) {
        this.container = container;
    }

    @Override
    public Object first() {
        return container.get(0);
    }

    @Override
    public Object next() {
        if (hasNext()) {
            return container.get(current++);
        }
        return null;
    }

    @Override
    public boolean hasNext() {
        return current < container.size();
    }

    @Override
    public Object currentItem() {
        return container.get(current);
    }
}

3、抽象容器類(lèi)

/**
 * 抽象容器類(lèi)
 *
 * @param <T>
 */
public interface AbsContainer<T> {
    /**
     * 創(chuàng)建迭代器
     */
    Iterator createIterator();

    /**
     * 容器容量
     */
    int size();

    /**
     * 獲取當(dāng)前元素
     */
    T get(int position);

    /**
     * 添加元素
     */
    void add(T element);
}

4握础、容器實(shí)現(xiàn)

/**
 * 容器類(lèi)
 */
public class Container implements AbsContainer {

    private List<Object> list = new ArrayList<>();

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public Object get(int position) {
        return list.get(position);
    }

    @Override
    public void add(Object element) {
        list.add(element);
    }
}

5辐董、測(cè)試

public class Test {

    public static void main(String... args) {

        Container container = new Container();
        container.add(1);
        container.add(3);
        container.add(5);
        container.add(7);
        container.add(9);

        Iterator iterator = container.createIterator();
        while (!iterator.isDone()){
            System.out.println(iterator.currentItem());
            iterator.next();
        }
    }
}

6、測(cè)試結(jié)果

1
3
5
7
9

參考鏈接

迭代器模式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禀综,一起剝皮案震驚了整個(gè)濱河市简烘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌定枷,老刑警劉巖孤澎,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異欠窒,居然都是意外死亡覆旭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)岖妄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)型将,“玉大人,你說(shuō)我怎么就攤上這事荐虐〔杳簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵缚俏,是天一觀的道長(zhǎng)惊搏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)忧换,這世上最難降的妖魔是什么恬惯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮亚茬,結(jié)果婚禮上酪耳,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好碗暗,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布颈将。 她就那樣靜靜地躺著,像睡著了一般言疗。 火紅的嫁衣襯著肌膚如雪晴圾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天噪奄,我揣著相機(jī)與錄音死姚,去河邊找鬼。 笑死勤篮,一個(gè)胖子當(dāng)著我的面吹牛都毒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碰缔,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼账劲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了金抡?” 一聲冷哼從身側(cè)響起瀑焦,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竟终,沒(méi)想到半個(gè)月后蝠猬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统捶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年榆芦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘鸟。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匆绣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出什黑,到底是詐尸還是另有隱情崎淳,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布愕把,位于F島的核電站拣凹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恨豁。R本人自食惡果不足惜嚣镜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橘蜜。 院中可真熱鬧菊匿,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至佩厚,卻和暖如春姆钉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背可款。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工育韩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留克蚂,地道東北人闺鲸。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像埃叭,于是被迫代替她去往敵國(guó)和親摸恍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚赤屋、低耦合和單一職能的“沖突”實(shí)際上立镶,這兩者...
    彥幀閱讀 3,752評(píng)論 0 14
  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★★★★】直接出處:迭代器模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 1,318評(píng)論 2 1
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是迭代器模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一...
    w1992wishes閱讀 520評(píng)論 0 1
  • 1 場(chǎng)景問(wèn)題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個(gè)實(shí)際應(yīng)用:整合工資表數(shù)據(jù)类早。 這個(gè)項(xiàng)目的背景是這樣的媚媒,項(xiàng)目...
    七寸知架構(gòu)閱讀 2,557評(píng)論 0 53
  • 從18年一月份起,我整個(gè)人都很好涩僻,應(yīng)該是很棒缭召。辭掉工作,進(jìn)入一種學(xué)習(xí)狀態(tài)逆日,感覺(jué)很舒服嵌巷。 如果要給17年做個(gè)總結(jié),我...
    Vivi楊閱讀 528評(píng)論 5 0