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

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

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

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


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

一、物以類聚

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

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

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

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

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

三、手寫迭代器

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

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

1.定義迭代器
public interface Iterator{//返回下一個元素
    E next();
    //是否還有下一個元素
    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. 至此,我們實現(xiàn)的迭代器已經(jīng)基本完成,用戶不但可以使用Iterator進行迭代,而且foreach循環(huán)也得到了支持,用戶再也不必為捉摸不定的迭代方式而犯愁了。當(dāng)然,為保持簡單,我們并沒有實現(xiàn)迭代器的所有功能接口,例如對remove()功能接口的實現(xiàn),利用這個接口用戶便可以刪除視頻記錄了。讀者可以在此基礎(chǔ)上繼續(xù)代碼實踐,需要注意的是對迭代器游標(biāo)的控制。
總結(jié)

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

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

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

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

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

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

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

廣告

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

成都app開發(fā)公司