過濾迭代器
利用迭代器,你不僅僅可以顯示集合中的每一項。你還可以選擇顯示的項。修改 Library::getIterator() 來使用其它兩種迭代器類型。
class Library { // ... function getIterator($type=false) { switch (strtolower($type)) { case ‘media’: $iterator_class = ‘LibraryIterator’; break; case ‘a(chǎn)vailable’: $iterator_class = ‘LibraryAvailableIterator’; break; case ‘released’: $iterator_class = ‘LibraryReleasedIterator’; break; default: $iterator_class = ‘LibraryGofIterator’; } return new $iterator_class($this->collection); } }
類 LibraryAvailableIterator 僅可以迭代狀態(tài)為“l(fā)ibrary”的項”(重新調(diào)用 checkOut() 方法,將狀態(tài)更改為“borrowed”)。
class IteratorTestCase extends UnitTestCase { // ... function TestAvailableIteratorUsage() { $this->lib->add($dvd = new Media(‘test’, 1999)); $this->lib->add(new Media(‘name4’, 1999)); $this->assertIsA( $it = $this->lib->getIterator(‘a(chǎn)vailable’) ,’LibraryAvailableIterator’); $output = ‘’; while ($item = $it->next()) { $output .= $item->name; } $this->assertEqual(‘name1name2name3testname4’, $output); $dvd->checkOut(‘Jason’); $it = $this->lib->getIterator(‘a(chǎn)vailable’); $output = ‘’; while ($item = $it->next()) { $output .= $item->name; } $this->assertEqual(‘name1name2name3name4’, $output); } }
該測試創(chuàng)建一個新的介質(zhì)實例,并將其存儲在變量 $dvd 中。突出顯示第一個 assertEqual() 聲明驗證利用 LibraryAvailableIterator 進行迭代時,存在一個新的項。接下來,測試使用 checkOut() 方法,并驗證新的項已丟失,不顯示。實現(xiàn)過濾得代碼非常類似于 LibraryIterator::next(),差別在于在返回項之前執(zhí)行過濾。如果當(dāng)前項與過濾條件不匹配,則代碼返回 $this->next()。
class LibraryAvailableIterator { protected $collection = array(); protected $first=true; function __construct($collection) { $this->collection = $collection; } function next() { if ($this->first) { $this->first = false; $ret = current($this->collection); } else { $ret = next($this->collection); } if ($ret && ‘library’ != $ret->status) { return $this->next(); } return $ret; } }
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計模式介紹之迭代器模式 [4] 下一頁 php設(shè)計模式介紹之迭代器模式 [6]
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|