設計模式專題(十六)——迭代器模式
設計模式專題(十六)——迭代器模式
(原創內容,轉載請註明來源,謝謝)
一、概述
迭代器模式(Iterator)提供一種方法,順序訪問一個聚合物件中的每個元素,而又不暴露該物件的內部表示。當需要訪問一個聚集物件,不管這些物件是什麼都要遍歷,則就要用到迭代器模式。另外,對聚集有多種方式遍歷時,也可以用迭代器模式。
迭代器為遍歷不同的聚集結構提供了開始入口、訪問下一個、判斷是否結束、當前某一項內容等的統一介面。foreach就是一個迭代器的體現,其不管傳入的陣列內部構造,都會逐個遍歷陣列的元素。
二、類圖
三、PHP中的迭代器
PHP中,通常情況下,foreach只能對陣列遍歷,當需要對類進行遍歷,PHP提供了介面,實現介面的類就可以直接用foreach進行遍歷。關於此部分內容,有一篇很經典的部落格——http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html,裡面除了迭代器,還講了PHP的SPL裡面的各中類和介面。
1、Iterator介面
該介面定義了五個方法,包括current、next、key、valid、rewind,需要在current裡面實現獲取返回當前內容;next裡實現迴圈到下一個元素;key實現獲取鍵的方式;valid實現驗證當前鍵是否有效;rewind實現。
2、IteratorAggregate介面
雖然Iterator介面可以實現對物件屬性的遍歷,但是很複雜,需要實現五個方法,較為繁瑣。因此,PHP還定義了一個迭代器,IteratorAggregate。
繼承該介面的類,只需要實現一個方法,getIterator,就可以實現迭代的功能。該方法需要返回另一個PHP內部定義的類Traversable的例項。
在PHP官方文件中已經很清晰的說明如何使用:
<?php class myData implementsIteratorAggregate { public $property1 = "Public propertyone"; public $property2 = "Public propertytwo"; public $property3 = "Public propertythree"; public function __construct() { $this->property4 = "lastproperty"; } public function getIterator() { return new ArrayIterator($this); } } $obj = new myData; foreach($obj as $key=> $value) { var_dump($key, $value); echo "n"; } ?>
這個方法的輸出了屬性、屬性值,如下:
string(9) "property1"
string(19) "Public propertyone"
string(9) "property2"
string(19) "Public propertytwo"
string(9) "property3"
string(21) "Public propertythree"
string(9) "property4"
string(13) "lastproperty"
——written by linhxx 2017.08.14
相關閱讀: