什麼是迭代器模式?
迭代器設計模式可以幫助建構特定對象,那些物件能夠提供單一標準介面循環或迭代任何類型的可計數資料。
迭代器模式問題與解決方案:
迭代器設計模式可幫助樣式物件處理資料或其他物件的集合。在建立基於迭代器設計模式的類別時,為了提供管理這些集合的統一方式,我們也會建立一組介面。
有些時候,資料集似乎十分簡單。程式設計師肯能無法預期將會發生變化的情景,因此他們選擇不修改程式碼和不創建迭代器。呼叫資料庫時常會出現這樣的情況。此時,程式設計人員建立了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 時,迭代器方法的呼叫順序。
<?php class 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"; } ?>
以上是PHP物件導向進階設計模式:迭代器模式使用實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!