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

迭代器模式(Iterator Pattern)目前已經(jīng)是一個(gè)沒落的模式,基本上沒人會(huì)單獨(dú)寫一個(gè)迭
代器

定義

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一種方法訪問一個(gè)容器對(duì)象中各個(gè)元素完疫,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。)

迭代器是為容器服務(wù)的,那什么是容器呢? 能容納對(duì)象的所有類型都可以稱之為容
器,例如Collection集合類型鹏秋、Set類型等,迭代器模式就是為解決遍歷這些容器中的元素而
誕生的亡笑。

迭代器模式提供了遍歷容器的方便性侣夷,容器只要管理增減元素就可以了,需要遍歷時(shí)交
由迭代器進(jìn)行

簡(jiǎn)單看一個(gè)例子:

ICar

public interface ICar {

    //生產(chǎn)一輛車
    public void add(String name,Integer price);

    //獲得一個(gè)可以被遍歷的對(duì)象
    public ICarIterator iterator();

    public String getCarInfo();
}

Car

/**
 * @author shuliangzhao
 * @Title: Car
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/16 23:36
 */
public class Car implements ICar {

    //定義一個(gè)車的集合
    private ArrayList<ICar> projectList = new ArrayList<ICar>();

    private String name;

    private Integer price;

    public Car() {

    }

    private Car(String name,Integer price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public void add(String name, Integer price) {
        this.projectList.add(new Car(name,price));
    }

    @Override
    public ICarIterator iterator() {
        return new CarIterator(projectList);
    }

    @Override
    public String getCarInfo() {
        return name + "價(jià)格是" + price;
    }
}

ICarIterator

/**
 * @author shuliangzhao
 * @Title: ICarIterator
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/16 23:33
 */
public interface ICarIterator extends Iterator {
}

CarIterator

 * @author shuliangzhao
 * @Title: CarIterator
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/16 23:38
 */
public class CarIterator implements ICarIterator {

    private ArrayList<ICar> carList = new ArrayList<ICar>();

    private int currentItem = 0;

    public CarIterator(ArrayList<ICar> carList) {
        this.carList = carList;
    }

    @Override
    public boolean hasNext() {
        boolean b = true;
        if(this.currentItem>=carList.size()||this.carList.get(this.currentItem) == null) {
            b = false;
        }
        return b;
    }

    @Override
    public ICar next() {
        return (ICar) this.carList.get(this.currentItem++);
    }
}

客戶端

/**
 * @author shuliangzhao
 * @Title: Client
 * @ProjectName design-parent
 * @Description: TODO
 * @date 2019/6/16 23:43
 */
public class Client {

    public static void main(String[] args) {
        ICar car = new Car();
        car.add("寶馬X1",200000);
        car.add("寶馬X2",300000);
        car.add("寶馬X3",400000);
        car.add("寶馬X4",500000);
        car.add("寶馬X5",600000);
        car.add("寶馬X6",700000);
        ICarIterator iterator = car.iterator();
        while (iterator.hasNext()) {
            Car car1 = (Car)iterator.next();
            System.out.println(car1.getCarInfo());
        }
    }
}

Java已經(jīng)把迭代器給我們準(zhǔn)備好了仑乌,我們?cè)偃懙靼偻兀陀悬c(diǎn)
多余了。所以呀晰甚,這個(gè)迭代器模式也有點(diǎn)沒落了衙传,基本上很少有項(xiàng)目再獨(dú)立寫迭代器了,直接使用Collection下的實(shí)現(xiàn)類就可以完美地解決問題厕九。
劃重點(diǎn):如果你是做Java開發(fā)蓖捶,盡量不要自己寫迭代器模式!省省吧扁远,使用Java提供的Iterator一般就能滿足你的要求了俊鱼。之所以舉這個(gè)例子是讓大家了解有這個(gè)迭代器模式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畅买,一起剝皮案震驚了整個(gè)濱河市并闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皮获,老刑警劉巖焙蚓,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洒宝,居然都是意外死亡购公,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門雁歌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宏浩,“玉大人,你說我怎么就攤上這事靠瞎”茸” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵乏盐,是天一觀的道長(zhǎng)佳窑。 經(jīng)常有香客問我,道長(zhǎng)父能,這世上最難降的妖魔是什么神凑? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上溉委,老公的妹妹穿的比我還像新娘鹃唯。我一直安慰自己,他們只是感情好瓣喊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布坡慌。 她就那樣靜靜地躺著,像睡著了一般藻三。 火紅的嫁衣襯著肌膚如雪洪橘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天趴酣,我揣著相機(jī)與錄音梨树,去河邊找鬼。 笑死岖寞,一個(gè)胖子當(dāng)著我的面吹牛抡四,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仗谆,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼指巡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了隶垮?” 一聲冷哼從身側(cè)響起藻雪,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狸吞,沒想到半個(gè)月后勉耀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹋偏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年便斥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片威始。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枢纠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黎棠,到底是詐尸還是另有隱情晋渺,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布脓斩,位于F島的核電站木西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏随静。R本人自食惡果不足惜户魏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挪挤。 院中可真熱鬧叼丑,春花似錦、人聲如沸扛门。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)论寨。三九已至星立,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葬凳,已是汗流浹背绰垂。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留火焰,地道東北人劲装。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昌简,于是被迫代替她去往敵國(guó)和親占业。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是迭代器模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 一...
    w1992wishes閱讀 517評(píng)論 0 1
  • 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述迭代子(Iterator)模式的:迭代子模式又叫游標(biāo)(Curso...
    Ant_way閱讀 415評(píng)論 0 0
  • 一纯赎、定義 迭代器模式(Iterator Pattern)目前已經(jīng)是一個(gè)沒落的模式谦疾,基本上沒人會(huì)單獨(dú)寫一個(gè)迭代器,除...
    端木軒閱讀 222評(píng)論 0 0
  • 1.迭代器模式的定義及使用場(chǎng)景定義:迭代器模式又稱游標(biāo)模式犬金,是行為型設(shè)計(jì)模式之一念恍。其源于對(duì)容器的訪問,比較java...
    GB_speak閱讀 423評(píng)論 0 0
  • 午飯后晚顷,為女兒們洗了餐后水果一串葡萄峰伙,葡萄很甜,顆顆圓潤(rùn)晶瑩音同,忍不住想畫下來(lái)词爬,就為葡萄模特?cái)[好位置,仔細(xì)端詳光線強(qiáng)...
    寸心潔白閱讀 238評(píng)論 2 2