亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式(12)迭代器模式(講解+應(yīng)用)

golden_hamster / 488人閱讀

摘要:目錄迭代器模式為什么要用迭代器模式迭代器模式應(yīng)用實(shí)例迭代器模式不知不覺(jué)更了篇,從今天開(kāi)始近乎每天全滿的課程開(kāi)始了,更新速度也要受到影響。

目錄

迭代器模式

為什么要用迭代器模式

迭代器模式應(yīng)用實(shí)例

迭代器模式

不知不覺(jué)更了12篇,從今天開(kāi)始近乎每天全滿的課程開(kāi)始了,更新速度也要受到影響。

迭代器,最早聽(tīng)到這個(gè)概念的時(shí)候是在大一的時(shí)候還對(duì)java一知半解就去搞Android的時(shí)候,接觸到的,在用到對(duì)于數(shù)據(jù)庫(kù)的操作的時(shí)候,我們來(lái)獲得數(shù)據(jù)的時(shí)候通過(guò) rawQuery執(zhí)行sql語(yǔ)句來(lái)獲得數(shù)據(jù)集返回的就是一個(gè)游標(biāo)實(shí)例,Cursor,因此迭代器模式也被稱作是游標(biāo)模式,具體例子和其使用在后面實(shí)例部分介紹。

迭代器:提供一種方法來(lái)遍歷集合的同時(shí),又不暴露該集合的底層數(shù)據(jù)存儲(chǔ)的實(shí)現(xiàn)。

為什么要使用迭代器模式

我們常見(jiàn)的集合有很多種類,其頂層數(shù)據(jù)存儲(chǔ)和組織方式的不同導(dǎo)致了我們?cè)趯?duì)數(shù)據(jù)進(jìn)行遍歷的時(shí)候存在一些差異,迭代器模式就是通過(guò)實(shí)現(xiàn)某種統(tǒng)一的方式來(lái)實(shí)現(xiàn)對(duì)不同的集合的遍歷,同時(shí)又不暴露出其底層的數(shù)據(jù)存儲(chǔ)和組織方式。

繼續(xù)我們?cè)鞕C(jī)器的問(wèn)題,在講適配器的時(shí)候提到了,我們擁有不止一個(gè)商店,而且每個(gè)商店里所出售的貨物的種類也是不同的,懼于馬云大大的“不做電子商務(wù)將無(wú)商可務(wù)”,決定不僅僅是通過(guò)線下的這種銷售,在網(wǎng)上也進(jìn)行出售,網(wǎng)上的店將作為一個(gè)集合,集合線下店里所有的產(chǎn)品,當(dāng)有客戶下單,就有具有該上商品的網(wǎng)店進(jìn)行發(fā)貨,那么第一個(gè)要解決的問(wèn)題就是我要知道這些商店里都有什么產(chǎn)品,所以需要他們給提供一個(gè)貨物的種類單,由于不同的商店,其對(duì)商品種類管理使用的數(shù)據(jù)結(jié)構(gòu)也是不相同的,有的是通過(guò)一個(gè)數(shù)組來(lái)存放,因?yàn)樗麄兊牡昀镉肋h(yuǎn)只會(huì)賣固定種類的貨物,然后有一些店里在不停的擴(kuò)展規(guī)模,因此會(huì)通過(guò)一個(gè)可擴(kuò)展的ArrayList來(lái)存放。(當(dāng)然,現(xiàn)實(shí)中不會(huì)如此,為了舉例方便)然后,現(xiàn)在各個(gè)商家給我數(shù)據(jù)了,而且不止這兩種,這個(gè)時(shí)候頭大了。

開(kāi)始,這樣來(lái)實(shí)現(xiàn)

public class Store{

//用來(lái)持有所有菜單條目
    public ArrayListlist = new ArrayList();

    public Store(){

    }
//針對(duì)不同的商店創(chuàng)建不同的類型
    public void getFirstStoreMachines(FirstStoreMenu menu){
        MenuItem [] firstStoreMenu = menu.getMenuItems();
        for(int i=0; i secondStoreMenu = menu.getMenuItems();
        for(int i=0; i

針對(duì)每一個(gè)商店的數(shù)據(jù)集進(jìn)行遍歷,來(lái)獲得菜單條目,如果有一百個(gè)商店,那么我們的代碼量將變得很大,同時(shí)后期的維護(hù)也變得很困難了。

這個(gè)時(shí)候,又到了設(shè)計(jì)模式大顯身手的時(shí)候了。通過(guò)迭代器模式來(lái)給數(shù)組和容器包上一層,使得其內(nèi)部結(jié)構(gòu)對(duì)外完全不可見(jiàn),從而使得我們無(wú)需針對(duì)每種數(shù)據(jù)結(jié)構(gòu)多帶帶進(jìn)行遍歷操作。代碼實(shí)例如下。
根據(jù)設(shè)計(jì)模式的基本原則針對(duì)接口編程,而不要針對(duì)具體類型,so

public interface Iterator{
    boolean hasNext();
    Object next();
}

看到這兩個(gè)方法,獲取sqlite數(shù)據(jù)庫(kù)中的數(shù)據(jù)的既視感。
然后之前我們的商店菜單類是這樣實(shí)現(xiàn)的

public class FirstStoreMenu extends Menu{
    MenuItem[] items;

    public MenuItem[] getFirstStoreMachines{
        return items;
    }
}

現(xiàn)在我們要使用迭代器了,所有要返回一個(gè)迭代器了,返回什么樣的迭代器,這個(gè)迭代器具體要怎么實(shí)現(xiàn)呢?

public class FirstMenuIterator implements Iterator{
    MenuItem[] items;
    int position=0;

    public FirstMenuIterator(MenuItem[] items){
        this.items = items;
    }
//向下移動(dòng)
    public Object next(){
        MenuItem menuItem  = items[position];
        position++;
        return menuItem;
    } 
//判斷
    public boolean hasNext(){
        if(position>=items.length||items[position]==null){
            return false;
        }else{
            return true;
        }
    }
}
//通過(guò)判斷和移動(dòng)的結(jié)合實(shí)現(xiàn)我們需要的遍歷操作

有了針對(duì)我們商店菜單的迭代器了,那么接下來(lái)可以這樣寫了

public class FirstStoreMenu extends Menu{
    MenuItem[]items;

    public Iterator createIterator(){
        return new FirstMenuIterator(items);
    }
}

我們總店中要如何應(yīng)用這個(gè)迭代器呢?

public class Store{

//用來(lái)持有所有菜單條目
    public ArrayListlist = new ArrayList();

    public Store(){

    }

    public void addItem(Iterator iterator){
        while(iterator.hasNext())
            list.add(iterator.next());
    }

//用來(lái)展示所有的商品種類
    public void display(){
        for(int i=0; i

通過(guò)這種方式,我們不僅使得代碼變得簡(jiǎn)潔(Store內(nèi)的代碼),同時(shí)也使得我們的編程針對(duì)接口再進(jìn)行編程。使得store類對(duì)各商店菜單類的耦合變低。這樣我們通過(guò)addItem方法向Store實(shí)例注入依賴實(shí)例即可完成對(duì)于各個(gè)商店的商品的匯總。

應(yīng)用實(shí)例

上面提到了Android的數(shù)據(jù)庫(kù)sqlite獲得數(shù)據(jù)的時(shí)候,當(dāng)然對(duì)于數(shù)據(jù)集的操作迭代器是很常用的。
Android中叫它游標(biāo),這個(gè)稱呼更好的反應(yīng)出了特性,在數(shù)據(jù)集之上游走。具體代碼此處不再貼出。

邊城大神,在文章中提到了一個(gè)橋接模式,對(duì)于這個(gè)模式,橋接模式其思想為,將對(duì)象和行為多帶帶封裝成類,對(duì)象的特征和行為松耦合,然后對(duì)象自身并不去實(shí)現(xiàn)行為,通過(guò)對(duì)委托的形式調(diào)用行為類,結(jié)構(gòu)上比較像是策略模式的結(jié)構(gòu)。

下篇更新生成器模式,結(jié)合Android中的AlertDialog.Builder來(lái)談下

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64655.html

相關(guān)文章

  • 從觀察者模式迭代模式系統(tǒng)講解 RxJS Observable(一)

    摘要:是的縮寫,起源于,是一個(gè)基于可觀測(cè)數(shù)據(jù)流結(jié)合觀察者模式和迭代器模式的一種異步編程的應(yīng)用庫(kù)。是基于觀察者模式和迭代器模式以函數(shù)式編程思維來(lái)實(shí)現(xiàn)的。學(xué)習(xí)之前我們需要先了解觀察者模式和迭代器模式,還要對(duì)流的概念有所認(rèn)識(shí)。 RxJS 是 Reactive Extensions for JavaScript 的縮寫,起源于 Reactive Extensions,是一個(gè)基于可觀測(cè)數(shù)據(jù)流 Stre...

    notebin 評(píng)論0 收藏0
  • PHP基礎(chǔ)

    摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見(jiàn)七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...

    HtmlCssJs 評(píng)論0 收藏0
  • 《JavaScript 模式》知識(shí)點(diǎn)小抄本(上)

    摘要:?jiǎn)误w模式有以下優(yōu)點(diǎn)用來(lái)劃分命名空間,減少全局變量數(shù)量。通常我們使用操作符創(chuàng)建單體模式的三種選擇,讓構(gòu)造函數(shù)總返回最初的對(duì)象使用全局對(duì)象來(lái)存儲(chǔ)該實(shí)例不推薦,容易全局污染。實(shí)現(xiàn)該工廠模式并不困難,主要是要找到能夠穿件所需類型對(duì)象的構(gòu)造函數(shù)。 介紹 最近開(kāi)始給自己每周訂個(gè)學(xué)習(xí)任務(wù),學(xué)習(xí)結(jié)果反饋為一篇文章的輸出,做好學(xué)習(xí)記錄。 這一周(02.25-03.03)我定的目標(biāo)是《JavaScri...

    didikee 評(píng)論0 收藏0
  • 進(jìn)階Java架構(gòu)師必看的15本書

    摘要:阿里巴巴的共享服務(wù)理念以及企業(yè)級(jí)互聯(lián)網(wǎng)架構(gòu)建設(shè)的思路,給這些企業(yè)帶來(lái)了不少新的思路,這也是我最終決定寫這本書的最主要原因。盡在雙阿里巴巴技術(shù)演進(jìn)與超越是迄今唯一由阿里巴巴集團(tuán)官方出品全面闡述雙八年以來(lái)在技術(shù)和商業(yè)上演進(jìn)和創(chuàng)新歷程的書籍。 showImg(https://segmentfault.com/img/remote/1460000015386860); 1、大型網(wǎng)站技術(shù)架構(gòu):核...

    Julylovin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<