日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

發(fā)布時間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
設(shè)計模式 ( 十四 ) 迭代器模式Iterator(對象行為型) 1.概述

類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實例化的對象,每個單獨的對象都有一個特定的身份和狀態(tài)。單獨的對象是一種組織代碼的有用方法,但通常你會處理一組對象或者集合。

集合不一定是均一的。圖形用戶界面框架中的 Window 對象可以收集任意數(shù)量的控制對象 - Menu、Slider 和 Button。并且,集合的實現(xiàn)可以有多種方式:PHP 數(shù)字是一個集合,但也是一個散列表,一個鏈接列表,一個堆棧以及隊列。

例子1:電視遙控器的頻道遍歷

2.問題

?

如何操縱任意的對象集合?? 如一個列表(List)或者一個集合(Set),我們又如何提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)?

?

3.解決方案

迭代器模式:使用迭代器模式來提供對聚合對象的統(tǒng)一存取,即提供一個外部的迭代器來對聚合對象進行訪問和遍歷 , 而又不需暴露該對象的內(nèi)部結(jié)構(gòu)。又叫做游標(Cursor)模式 。
你可能沒有意識到這一點,但你每天都在使用迭代器模式 。
如在PHP開發(fā)中,它潛藏在 PHP 的數(shù)組類型和各種數(shù)組操作函數(shù)中。(其實,給你一些固有類的數(shù)組的組合和一群用這些固有類工作的可變函數(shù),你將不得不使用這些數(shù)組來處理對象集合。這是在 PHP 中的本地數(shù)組迭代:

?

[php]?view plaincopy print?
  • $test??=??array(‘one’,??‘two’,??‘three’);??
  • $output??=??‘’;?reset($test);???
  • do??{??
  • $output??.=??current($test);??
  • }??while??(next($test));??
  • echo??$output;??//??produces??‘onetwothree’??
  • ?

    ?

    ? ? ? ? reset() 函數(shù)將迭代重新轉(zhuǎn)到數(shù)組的開始;current() 返回當前元素的值;next() 則前進至數(shù)組中的下一個元素并返回新的 current() 值。當你超出數(shù)組的最后一個元素時,next() 返回 false。使用這些迭代方法,PHP 數(shù)組的內(nèi)部實現(xiàn)就與你不相關(guān)了。

    ? ? ? ? 迭代器結(jié)合了封裝和多態(tài)的面向?qū)ο蟪绦蛟O(shè)計原理。使用迭代器,你可以對集合中的對象進行操作,而無需專門了解集合如何顯現(xiàn)或者集合包含什么(對象的種類)。迭代器提供了不同固定迭代實現(xiàn)的統(tǒng)一接口,它完全包含了如何操縱特定集合的詳細信息,包括顯示哪些項(過濾)及其顯示順序(排序)。

    ?

    4.適用性

    迭代器模式可用來:

    ? 訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示。
    ? 需要為聚合對象提供多種遍歷方式。
    ? 為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口 (即, 支持多態(tài)迭代)

    5.結(jié)構(gòu)

    結(jié)構(gòu)上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內(nèi)部細節(jié)的暴露,而且也使得設(shè)計符號“單一職責原則”。

    注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的——遍歷算法是與容器的內(nèi)部細節(jié)緊密相關(guān)的。為了使客戶程序從與具體迭代器角色耦合的困境中脫離出來,避免具體迭代器角色的更換給客戶程序帶來的修改,迭代器模式抽象了具體迭代器角色,使得客戶程序更具一般性和重用性。這被稱為多態(tài)迭代。

    6.模式的組成

    抽象迭代器(Iterator):?迭代器定義訪問和遍歷元素的接口。
    具體迭代器(ConcreteIterator):??具體迭代器實現(xiàn)迭代器Iterator接口。對該聚合遍歷時跟蹤當前位置。
    抽象聚合類(Aggregate):?聚合定義創(chuàng)建相應(yīng)迭代器對象的接口。
    具體聚合類(ConcreteAggregate):?體聚合實現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個適當?shù)膶嵗?

    7.效果

    ?

    ?迭代器模式的作用: 1 ) 它支持以不同的方式遍歷一個聚合對象?: 復(fù)雜的聚合可用多種方式進行遍歷。迭代器模式使得改變遍歷算法變得很容易 : 僅需用一個不同的迭代器的實例代替原先的實例即可。你也可以自己定義迭代器的子類以支持新的遍歷。
    2) 迭代器簡化了聚合的接口 有了迭代器的遍歷接口,聚合本身就不再需要類似的遍歷接口了。這樣就簡化了聚合的接口。
    3) 在同一個聚合上可以有多個遍歷 每個迭代器保持它自己的遍歷狀態(tài)。因此你可以同時進行多個遍歷。 4)在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足“開閉原則”的要求。 迭代器模式的缺點 由于迭代器模式將存儲數(shù)據(jù)和遍歷數(shù)據(jù)的職責分離,增加新的聚合類需要對應(yīng)增加新的迭代器類,類的個數(shù)成對增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性。

    ?

    8.實現(xiàn)

    ?

    我們直接實現(xiàn)spl的iterator:

    ?

    [php]?view plaincopy print?
  • <?php??
  • ??
  • /**?
  • ?*?具體迭代器(ConcreteIterator):??具體迭代器實現(xiàn)迭代器Iterator接口。對該聚合遍歷時跟蹤當前位置。?
  • ?*/??
  • class??ConcreteIterator?implements??Iterator?{??
  • ????protected?$_key;??
  • ????protected?$_collection;??
  • ????public?function?__construct($collection){??
  • ????????$this->_collection?=?$collection;??
  • ????????$this->_key?=?0;??
  • ????}??
  • ????public?function?rewind(){??
  • ????????$this->_key?=?0;??
  • ????}??
  • ????public?function?valid(){??
  • ??
  • ????????return?isset($this->_collection[$this->_key]);??
  • ????}??
  • ????public?function?key(){??
  • ????????return?$this->_key;??
  • ????}??
  • ????public?function?current(){??
  • ????????return?$this->_collection[$this->_key];??
  • ????}??
  • ????public?function?next(){??
  • ????????return?++$this->_key;??
  • ????}??
  • ??
  • }??
  • ??
  • /**?
  • ?*?具體聚合類(ConcreteAggregate):??
  • ?*/??
  • class?ConcreteAggregate?implements?IteratorAggregate{??
  • ????protected?$_arr;??
  • ????public?function?__construct($array){??
  • ????????$this->_arr?=?$array;??
  • ????}??
  • ??
  • ????public?function?getIterator(){??
  • ????????return?new????ConcreteIterator($this->_arr);??
  • ????}??
  • }??
  • ??
  • $_collectionay?=?array(1,2,3,3,4);??
  • $it?=?new?ConcreteIterator($_collectionay);??
  • foreach($it?as?$key=>$value){??
  • ????echo?$key.':'.$value.'<br/>';??
  • }??


  • ?

    ?

    9.與其他相關(guān)模式

    Composite?:迭代器常被應(yīng)用到象復(fù)合這樣的遞歸結(jié)構(gòu)上。
    Factory Method:多態(tài)迭代器靠Factory Method來例化適當?shù)牡髯宇悺?br />Memento:常與迭代器模式一起使用。迭代器可使用一個 Memento來捕獲一個迭代的狀態(tài)。迭代器在其內(nèi)部存儲Memento。

    10.總結(jié)與分析

    ?

    ?

    1)聚合是一個管理和組織數(shù)據(jù)對象的數(shù)據(jù)結(jié)構(gòu)。 2)聚合對象主要擁有兩個職責:一是存儲內(nèi)部數(shù)據(jù);二是遍歷內(nèi)部數(shù)據(jù)。 3)存儲數(shù)據(jù)是聚合對象最基本的職責。 4)將遍歷聚合對象中數(shù)據(jù)的行為提取出來,封裝到一個迭代器中,通過專門的迭代器來遍歷聚合對象的內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責原則”的完美體現(xiàn)。

    總結(jié)

    以上是生活随笔為你收集整理的设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。