測(cè)試類(lèi)
現(xiàn)在,代碼更加復(fù)雜了,但是其如何支持其它迭代器類(lèi)型?添加一個(gè)關(guān)于“發(fā)行版”迭代器的測(cè)試,來(lái)查看這種設(shè)計(jì)的其它迭代器如何工作。
class PolySplIteratorTestCase extends UnitTestCase { // ... function TestReleasedForeach() { $this->lib->add(new Media(‘second’, 1999)); $this->lib->add(new Media(‘first’, 1989)); $output = array(); $this->lib->iteratorType(‘Released’); foreach($this->lib as $item) { $output[] = $item->name .’-’. $item->year; } $this->assertEqual( ‘first-1989 second-1999 name1-2000 name3-2001 name2-2002’ ,implode(‘ ‘,$output)); } }
上面的測(cè)試用例看起來(lái)也很熟悉,因?yàn)槠浞浅n?lèi)似于前一個(gè)“發(fā)行版”迭代器,但是使用了 foreach 控制結(jié)構(gòu)進(jìn)行循環(huán)。
class PolymorphicForeachableLibrary extends Library implements Iterator { protected $iterator_type; protected $iterator; function __construct() { $this->iteratorType(); } function iteratorType($type=false) { switch(strtolower($type)) { case ‘released’: $this->iterator_type = ‘ReleasedLibraryIterator’; break; default: $this->iterator_type = ‘StandardLibraryIterator’; } $this->rewind(); } // ... function rewind() { $type = $this->iterator_type; $this->iterator = new $type($this->collection); $this->iterator->rewind(); } }
新的 iteratorType() 方法使你轉(zhuǎn)變要使用的迭代器的類(lèi)型。(因?yàn)榈黝?lèi)型并不是在對(duì)象安裝期間選中的,并且你可以在空閑時(shí)再次調(diào)用 iteratorType() 方法來(lái)選擇不同迭代器類(lèi)型,所以實(shí)際上是在 State 模式執(zhí)行代碼,而不是 Strategy 模式。)
class ReleasedLibraryIterator extends StandardLibraryIterator { function __construct($collection) { usort($collection ,create_function(‘$a,$b’,’return ($a->year - $b->year);’)); $this->collection = $collection; } }
你可以簡(jiǎn)單地通過(guò)擴(kuò)展 StandardLibraryIterator 并覆蓋構(gòu)造函數(shù)來(lái)添加入局?jǐn)?shù)組的排序,從而實(shí)現(xiàn) ReleasedLibraryIterator。并且,通過(guò)它,你可以有一個(gè) working PolymorphicForeachableLibrary。
總結(jié)
迭代器是標(biāo)準(zhǔn)化地地處理應(yīng)用程序中對(duì)象集合的方法。這些例子是基于數(shù)組的,但是對(duì)于擁有同一個(gè)接口的非數(shù)組集合,工作起來(lái)將更加強(qiáng)大。使用 foreach 控制結(jié)構(gòu)方式的集合確實(shí)非?。 SPL 實(shí)現(xiàn)中最不幸的問(wèn)題是與迭代器可能存在的名稱(chēng)空間沖突。有多少 PHP4 面向?qū)ο蟮拇a擁有類(lèi)似于迭代器類(lèi)作為庫(kù)迭代器類(lèi)的基類(lèi)?在一些容量中有多少 5 種必需方法的定義?可能一個(gè)更加具有深刻含義的名稱(chēng)就能實(shí)現(xiàn) Foreachable。如果你選擇使用 SPL,則還應(yīng)該研究其它支持的迭代器,例如RecursiveArrayIterator 和其它眾多迭代器。
下文:《PHP設(shè)計(jì)模式介紹》第九章 觀測(cè)模式
本文鏈接:http://www.95time.cn/tech/program/2008/6012.asp
出處:phpchina
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之迭代器模式 [7] 下一頁(yè)
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|