成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

golden_hamster / 433人閱讀

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

目錄

迭代器模式

為什么要用迭代器模式

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

迭代器模式

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

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

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

為什么要使用迭代器模式

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

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

開始,這樣來實(shí)現(xiàn)

public class Store{

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

    public Store(){

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

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

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

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

看到這兩個(gè)方法,獲取sqlite數(shù)據(jù)庫中的數(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;
        }
    }
}
//通過判斷和移動(dòng)的結(jié)合實(shí)現(xiàn)我們需要的遍歷操作

有了針對我們商店菜單的迭代器了,那么接下來可以這樣寫了

public class FirstStoreMenu extends Menu{
    MenuItem[]items;

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

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

public class Store{

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

    public Store(){

    }

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

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

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

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64655.html

相關(guān)文章

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

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

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

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

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

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

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

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

    Julylovin 評論0 收藏0

發(fā)表評論

0條評論

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