歡迎您光臨本站 註冊首頁

本文例項講述了PHP設計模式之迭代器模式Iterator。分享給大家供大家參考,具體如下:
1.概述
類中的面向物件程式設計封裝應用邏輯。類,就是例項化的物件,每個單獨的物件都有一個特定的身份和狀態。單獨的物件是一種組織程式碼的有用方法,但通常你會處理一組物件或者集合。
集合不一定是均一的。圖形使用者介面框架中的 Window 物件可以收集任意數量的控制物件 - Menu、Slider 和 Button。並且,集合的實現可以有多種方式:PHP 數字是一個集合,但也是一個散列表,一個連結列表,一個堆疊以及佇列。
例子1:電視遙控器的頻道遍歷
2.問題
如何操縱任意的物件集合?
如一個列表(List)或者一個集合(Set),我們又如何提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內部結構?
3.解決方案
迭代器模式:使用迭代器模式來提供對聚合物件的統一存取,即提供一個外部的迭代器來對聚合物件進行訪問和遍歷 , 而又不需暴露該物件的內部結構。又叫做遊標(Cursor)模式 。
你可能沒有意識到這一點,但你每天都在使用迭代器模式 。
如在PHP開發中,它潛藏在 PHP 的陣列型別和各種陣列操作函式中。(其實,給你一些固有類的陣列的組合和一群用這些固有類工作的可變函式,你將不得不使用這些陣列來處理物件集合。這是在 PHP 中的本地陣列迭代:
$test = array(『one', 『two', 『three'); $output = 『'; reset($test); do { $output .= current($test); } while (next($test)); echo $output; // produces 『onetwothree'
reset() 函式將迭代重新轉到陣列的開始;current() 返回當前元素的值;next() 則前進至陣列中的下一個元素並返回新的 current() 值。當你超出陣列的最後一個元素時,next() 返回 false。使用這些迭代方法,PHP 陣列的內部實現就與你不相關了。
迭代器結合了封裝和多型的面向物件程式設計原理。使用迭代器,你可以對集合中的物件進行操作,而無需專門瞭解集合如何顯現或者集合包含什麼(物件的種類)。迭代器提供了不同固定迭代實現的統一介面,它完全包含了如何操縱特定集合的詳細資訊,包括顯示哪些項(過濾)及其顯示順序(排序)。
4.適用性
迭代器模式可用來:
• 訪問一個聚合物件的內容而無需暴露它的內部表示。
• 需要為聚合物件提供多種遍歷方式。
• 為遍歷不同的聚合結構提供一個統一的介面 (即, 支援多型迭代)
5.結構
結構上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內部細節的暴露,而且也使得設計符號「單一職責原則」。
注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的――遍歷演演算法是與容器的內部細節緊密相關的。為了使客戶程式從與具體迭代器角色耦合的困境中脫離出來,避免具體迭代器角色的更換給客戶程式帶來的修改,迭代器模式抽象了具體迭代器角色,使得客戶程式更具一般性和重用性。這被稱為多型迭代。
6.模式的組成
抽象迭代器(Iterator): 迭代器定義訪問和遍歷元素的介面。
具體迭代器(ConcreteIterator): 具體迭代器實現迭代器Iterator介面。對該聚合遍歷時跟蹤當前位置。
抽象聚合類(Aggregate): 聚合定義建立相應迭代器物件的介面。
具體聚合類(ConcreteAggregate): 體聚合實現建立相應迭代器的介面,該操作返回ConcreteIterator的一個適當的例項。
7.效果
•迭代器模式的作用:
1 ) 它支援以不同的方式遍歷一個聚合物件 : 複雜的聚合可用多種方式進行遍歷。迭代器模式使得改變遍歷演演算法變得很容易 : 僅需用一個不同的迭代器的例項代替原先的例項即可。你也可以自己定義迭代器的子類以支援新的遍歷。
2) 迭代器簡化了聚合的介面 有了迭代器的遍歷介面,聚合本身就不再需要類似的遍歷介面了。這樣就簡化了聚合的介面。
3) 在同一個聚合上可以有多個遍歷 每個迭代器保持它自己的遍歷狀態。因此你可以同時進行多個遍歷。
4)在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有程式碼,滿足「開閉原則」的要求。
迭代器模式的缺點
由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。
8.實現
我們直接實現spl的iterator:

_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.'
'; }
9.與其他相關模式
Composite :迭代器常被應用到象複合這樣的遞迴結構上。
Factory Method:多型迭代器靠Factory Method來例化適當的迭代器子類。
Memento:常與迭代器模式一起使用。迭代器可使用一個 Memento來捕獲一個迭代的狀態。迭代器在其內部儲存Memento。
10.總結與分析
1)聚合是一個管理和組織資料物件的資料結構。
2)聚合物件主要擁有兩個職責:一是儲存內部資料;二是遍歷內部資料。
3)儲存資料是聚合物件最基本的職責。
4)將遍歷聚合物件中資料的行為提取出來,封裝到一個迭代器中,透過專門的迭代器來遍歷聚合物件的內部資料,這就是迭代器模式的本質。迭代器模式是「單一職責原則」的完美體現。


[hongdian2012 ] PHP設計模式之迭代器模式Iterator例項分析【物件行為型】已經有404次圍觀

http://coctec.com/docs/php/show-post-232637.html