行為篇-迭代器模式-創(chuàng)新互聯(lián)

文章目錄
  • 前言
  • 一、物以類聚
  • 二、遍歷標(biāo)準(zhǔn)化
  • 三、手寫迭代器
    • 1.定義迭代器
    • 2.行車記錄儀類
    • 3.客戶端類
  • 總結(jié)

成都創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都成百上千中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
前言

迭代,在程序中特指對(duì)某集合中各元素逐個(gè)取用的行為。迭代器模式(Iterator)提供了一種機(jī)制來按順序訪問集合中的各元素,而不需要知道集合內(nèi)部的構(gòu)造。換句話講,迭代器滿足了對(duì)集合迭代的需求,并向外部提供了一種統(tǒng)一的迭代方式,而不必暴露集合的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、物以類聚

迭代的過程是基于一系列數(shù)據(jù)展開的,所以集合是不得不提的概念。物以類聚,集合是由一個(gè)或多個(gè)確定的元素構(gòu)成的整體,其實(shí)就是把一系列類似的元素按某種數(shù)據(jù)結(jié)構(gòu)集結(jié)起來,作為一個(gè)整體來引用,以便于維護(hù)。簡單來講,可以把集合理解為“一堆”或者“一群”類似的元素集結(jié)起來的整體。為了承載不同的數(shù)據(jù)形式,集合類提供了多種多樣的數(shù)據(jù)結(jié)構(gòu),如我們常用的ArrayList、HashSet、HashMap等,

每種集合都有不同的特性,可以滿足對(duì)各種數(shù)據(jù)結(jié)構(gòu)的承載需求。有了集合才會(huì)產(chǎn)生對(duì)其迭代的需求,而每種數(shù)據(jù)結(jié)構(gòu)的迭代方式又不盡相同,所以,定義標(biāo)準(zhǔn)化的迭代器勢(shì)在必行,以提供統(tǒng)一、通用的使用方法。

二、遍歷標(biāo)準(zhǔn)化

不同的數(shù)據(jù)結(jié)構(gòu)需要不同的集合類,而針對(duì)不同的集合類的迭代方式也不盡相同,如for、foreach、while,甚至Java8引入的流式遍歷等。舉個(gè)例子,我們可以使用傳統(tǒng)的for循環(huán)對(duì)List集合進(jìn)行迭代遍歷,而對(duì)于Set集合,for循環(huán)就無能為力了,這是因?yàn)镾et本身集合不存在index索引號(hào),所以必須用foreach循環(huán)(迭代器Iterator)進(jìn)行遍歷。難道就沒有一種通用的迭代標(biāo)準(zhǔn),能讓調(diào)用者使用統(tǒng)一的方式進(jìn)行遍歷嗎?如果我們深究源碼就會(huì)發(fā)現(xiàn),Collection接口中有這樣一個(gè)接口。

Collection接口的一段源碼,可以看到其明確聲明了獲取迭代器的接口iterator(),通過調(diào)用這個(gè)接口就可以返回標(biāo)準(zhǔn)的迭代器對(duì)象。既然有了這種標(biāo)準(zhǔn),那么Collection這集合類就可以實(shí)現(xiàn)自己的迭代器。而Map集合也可以按照同樣的方式,從其EntrySet中獲取迭代器??梢?,標(biāo)準(zhǔn)化的迭代器其實(shí)已經(jīng)被各種集合類實(shí)現(xiàn)了,否則用戶就無法站在Collection接口的抽象高度上對(duì)任何集合進(jìn)行統(tǒng)一遍歷。

三、手寫迭代器

汽車前擋風(fēng)玻璃上安裝了一臺(tái)行車記錄儀,它最主要的一項(xiàng)功能就是記錄行駛路途中所拍攝的視頻信息,以防發(fā)生交通事故后作為證據(jù)之用。我們知道,行車記錄儀所記錄下來的視頻文件是比較大的,同時(shí)其存儲(chǔ)空間又是有限的,那么它是怎樣確保一直不間斷地錄制視頻,并且存儲(chǔ)空間不被占滿呢?這就需要我們深究其內(nèi)部數(shù)據(jù)結(jié)構(gòu)了。

其實(shí),行車記錄儀的視頻錄制存盤操作有循環(huán)覆寫的特性,待空間不夠用時(shí),新錄的視頻就會(huì)覆蓋最早的視頻,以首尾相接的環(huán)形結(jié)構(gòu)來解決存儲(chǔ)空間有限的問題。

1.定義迭代器
public interface Iterator{//返回下一個(gè)元素
    E next();
    //是否還有下一個(gè)元素
    boolean hasNext();
}
2.行車記錄儀類
public class DrivingRecorder{private int index = -1;//當(dāng)前記錄的位置
    private String[] records = new String[10]; //假設(shè)只能記錄10條視頻

    public void append(String record){//索引重置,從頭覆蓋
        if(index == 9 ){index = 0;
        }else {index++;
        }
        records[index] = record;
    }


    public Iteratoriterator() {return new Itr();
    }

    private class Itr implements Iterator{int cursor = index;//迭代器游標(biāo),不破及原始集合索引
        int loopCount = 0;

        @Override
        public String next() {int i = cursor;
            if(cursor == 0){cursor = 9;
            }else {cursor--;
            }
            loopCount++;
            return  records[i];
        }

        @Override
        public boolean hasNext() {return loopCount< 10;
        }
    }
}
3.客戶端類
public class Client {public static void main(String[] args) {DrivingRecorder dr = new DrivingRecorder();
        for (int i = 0; i< 12; i++) {dr.append("視頻_" + i);
        }
        ListuStorage = new ArrayList<>();
        Iterator it = dr.iterator();
        while (it.hasNext()){String video = (String) it.next();
            System.out.println(video);
            if("視頻_10".equals(video) || "視頻_8".equals(video)){uStorage.add(video);
            }
        }
        System.out.println("事故證據(jù)" + uStorage);
    }
}

輸出結(jié)果:
視頻_11
視頻_10
視頻_9
視頻_8
視頻_7
視頻_6
視頻_5
視頻_4
視頻_3
視頻_2
事故證據(jù)[視頻_10, 視頻_8]

說明:

  1. 至此,我們實(shí)現(xiàn)的迭代器已經(jīng)基本完成,用戶不但可以使用Iterator進(jìn)行迭代,而且foreach循環(huán)也得到了支持,用戶再也不必為捉摸不定的迭代方式而犯愁了。當(dāng)然,為保持簡單,我們并沒有實(shí)現(xiàn)迭代器的所有功能接口,例如對(duì)remove()功能接口的實(shí)現(xiàn),利用這個(gè)接口用戶便可以刪除視頻記錄了。讀者可以在此基礎(chǔ)上繼續(xù)代碼實(shí)踐,需要注意的是對(duì)迭代器游標(biāo)的控制。
總結(jié)

提示:這里對(duì)文章進(jìn)行總結(jié):

  1. 為了完成對(duì)各種集合類的遍歷,我們定義了統(tǒng)一的迭代器接口Iterator,基于此我們讓集合以內(nèi)部類的方式實(shí)現(xiàn)其特有的迭代邏輯,再將自己標(biāo)記為Iterable并返回迭代器實(shí)例,以證明自己是具備迭代能力的。具體的集合內(nèi)部結(jié)構(gòu)與迭代邏輯對(duì)于客戶端這個(gè)“局外人”是透明的,客戶端只需要知道這個(gè)集合是可以迭代的,并向集合發(fā)起迭代請(qǐng)求以獲取迭代器即可以進(jìn)行標(biāo)準(zhǔn)方式的遍歷了。

  2. 迭代器模式的各角色定義如下:

  • ConcreteAggregate(集合實(shí)現(xiàn)):實(shí)現(xiàn)集合接口Aggregate的具體集合類,可以實(shí)例化并返回一個(gè)迭代器以供外部使用。對(duì)應(yīng)本章例程中的行車記錄儀類DrivingRecorder。
  • Iterator(迭代器接口):迭代器的接口標(biāo)準(zhǔn),定義了進(jìn)行迭代操作所需的一些方法,如next()、hasNext()等。
  • ConcreteIterator(迭代器實(shí)現(xiàn)):迭代器接口Iterator的具體實(shí)現(xiàn)類,記錄迭代狀態(tài)并對(duì)外部提供所有迭代器功能的實(shí)現(xiàn)。
  • Client(客戶端):集合數(shù)據(jù)的使用者,需要從集合獲取迭代器再進(jìn)行遍歷。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞名稱:行為篇-迭代器模式-創(chuàng)新互聯(lián)
分享URL:http://www.muchs.cn/article6/dpcgig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、做網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、軟件開發(fā)、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司