什麼是迭代器模式?
迭代器設計模式可以協助構造特定對象,那些對象能夠提供單一標準介面迴圈或迭代任何類型的可計數資料。
迭代器模式問題與解決方案:
迭代器設計模式協助樣式對象處理資料或其他對象的集合。建立基於迭代器設計模式的類時,為了提供管理這些集合的統一方式,我們還會建立一組介面。
有些時候,資料集似乎十分簡單。編程人員肯能無法預計將會發生變化的情景,因此他們選擇不修改代碼和不建立迭代器。調用資料庫時經常會出現這樣的情況。此時,編程人員建立了MySQL查詢,隨後會執行簡單的取數組命令。但是,在代碼中保留這樣的程式性方式並不是最佳的解決方案。
處理MySQL結果集時應當建立迭代器對象。比較簡單的做法是為類建構函式提供一個MySQL查詢,然後通過調用迭代器對象的公用方法遍曆迴圈結果集。更複雜的迭代器樣本可能還具有要發送給迭代器的其他參數,根據這些條件,就可能執行不同的MySQL查詢集。不過無論如何,外部的代碼流只通過處理相同煩人公用方法來擷取集合中的下一個項。
處理需要遍曆的可計數資料時,最佳的解決方案是建立一個基於迭代器模式的對象。
UML
該圖詳細說明了一個使用迭代器設計模式的類設計。
下面是對的說明:
1.MyObject是能夠收集入可技數集合的基底物件。MyObject具有一個名為name的私人字串,這個字串用於代表特定對象的唯一性。公用方法getName()提供了通過私人名name檢索對象名稱的介面。
2.MyObjectCollection表示一個管理MyObject對象集合的類。MyObjects數組容納這些對象的集合。getMyObjects()提供的邏輯被用於建立集合和在MyObjects數組中儲存物件。
3.MyObjectCollectionIterator提供了對MyObjectCollection中儲存的對象進行迭代的介面。這個類具有兩個公用方法。其中,hasNext()方法使調用程式知道MyObjects的MyObjectCollection集合中是否還有其他項:getNext()方法會返回MyObjectCollection中數組內的下一個MyObject對象。
使用執行個體
這個例子展示了使用 foreach 時,迭代器方法的調用順序。
<?phpclass myIterator implements Iterator { private $position = 0; private $array = array( "firstelement", "secondelement", "lastelement", ); public function __construct() { $this->position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); }}$it = new myIterator;foreach($it as $key => $value) { var_dump($key, $value); echo "\n";}?>