国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

《PHP設計模式介紹》第八章 迭代器模式

2024-05-04 21:51:47
字體:
來源:轉載
供稿:網友

類中的面向對象編程封裝應用邏輯。類,就是實例化的對象,每個單獨的對象都有一個特定的身份和狀態。單獨的對象是一種組織代碼的有用方法,但通常你會處理一組對象或者集合。

屬性來自 SQL 查詢的一組數據就是一個集合,就像本書前面章節介紹的 Monopoly 游戲示例的對象列表。

集合不一定是均一的。圖形用戶界面框架中的 Window 對象可以收集任意數量的控制對象 - Menu、Slider 和 Button。并且,集合的實現可以有多種方式:PHP 數字是一個集合,但也是一個散列表,一個鏈接列表,一個堆棧以及隊列。


問題

如何操縱任意的對象集合?

解決方案

使用迭代器模式來提供對集合內容的統一存取。

你可能沒有意識到這一點,但你每天都在使用迭代器模式 - 它潛藏在 PHP 的數組類型和各種數組操作函數中。(其實,給你一些固有類的數組的組合和一群用這些固有類工作的可變函數,你將不得不使用這些數組來處理對象集合。這是在 PHP 中的本地數組迭代:


$test = array(‘one’, ‘two’, ‘three’);
$output = ‘’; reset($test);
do {
$output .= current($test);
} while (next($test));
echo $output; // produces ‘onetwothree’

reset() 函數將迭代重新轉到數組的開始;current() 返回當前元素的值;next() 則前進至數組中的下一個元素并返回新的 current() 值。當你超出數組的最后一個元素時,next() 返回 false。使用這些迭代方法,PHP 數組的內部實現就與你不相關了。迭代器結合了封裝和多態的面向對象程序設計原理。使用迭代器,你可以對集合中的對象進行操作,而無需專門了解集合如何顯現或者集合包含什么(對象的種類)。迭代器提供了不同固定迭代實現的統一接口,它完全包含了如何操縱特定集合的詳細信息,包括顯示哪些項(過濾)及其顯示順序(排序)。

讓我們創建一個簡單的對象,在數組中對它進行操作。(盡管該示例在 PHP5 環境下,但迭代器并不特定于 PHP5。雖然添加了較多的引用操作符,本章節中的大多數示例在 PHP4 下也能夠運行)。對象 Lendable 表示諸如電影、相冊等媒體,它作為 web 站點的一部分或服務,允許用戶瀏覽或將他們的媒體集合分享給其他用戶。(對 于該示例,請無需考慮其他方面。)讓我們開始下面對 Lendable 基礎設計的測試。

// PHP5
class LendableTestCase extends UnitTestCase {
function TestCheckout() {
$item = new Lendable;
$this->assertFalse($item->borrower);
$item->checkout(‘John’);
$this->assertEqual(‘borrowed’, $item->status);
$this->assertEqual(‘John’, $item->borrower);
}
function TestCheckin() {
$item = new Lendable;
$item->checkout(‘John’);
$item->checkin();
$this->assertEqual(‘library’, $item->status);
$this->assertFalse($item->borrower);
}
}

要實現這一最初測試的需求,我們來創建一個帶有若干公共屬性和一些方法的類,
來觸發這些屬性的值:

class Lendable {
public $status = ‘library’;
public $borrower = ‘’;
public function checkout($borrower) {
$this->status = ‘borrowed’;
$this->borrower = $borrower;
}
public function checkin() {
$this->status = ‘library’;
$this->borrower = ‘’;
}
}

Lendable 是一個好的,普通的開端。讓我們將它擴展到諸如 DVD 或 CD 的磁道項。媒體擴展了 Lendable,并且磁道詳細記錄了特定媒體的詳細信息,包括項目的名稱,發布的年份以及項本身的類型:

class Media extends Lendable {
public $name; public $type; public $year;
public function __construct($name, $year, $type=’dvd’ ) {
$this->name = $name;
$this->type = $type;
$this->year = (int)$year;
}
}

要使事情更加簡單,媒體有三個公共的實例變量,Media::name,Media::year 和Media::type。構造函數采用了兩個參數,將第一個存儲在 $name 中,第二個存儲在 $year 中。構造函數還允許可選的第三個參數來指定類型(缺省為dvd)。

給定單獨的對象來操作,你現在可以創建一個容器來包含他們:Library。類似于常用的庫,Library 應該能夠添加,刪除和計算集合中的項。甚至,Library 還應該允許訪問集合(本章中的樣本代碼部分可看到示例)中的單一的項(對象)。

我們開始構建 Library 的測試用例。

class LibraryTestCase extends UnitTestCase {
function TestCount() {
$lib = new Library;
$this->assertEqual(0, $lib->count());
}
}

它是滿足這一測試的簡單類:

class Library {
function count() {
return 0;
}
}


繼續將一些有趣的功能添加到測試中:

class LibraryTestCase extends UnitTestCase {
function TestCount() { /* ... */ }
function TestAdd() {
$lib = new Library;
$lib->add(‘one’);
$this->assertEqual(1, $lib->count());
}
}

實現 add() 的簡單方法是建立在 PHP 靈活數組函數的基礎上:你可以將項添加到實例變量并使用 count() 來返回集合眾項的數量。


class Library {
protected $collection = array();
function count() {
return count($this->collection);
}
function add($item) {
$this->collection[] = $item;
}
}


Library 現在是一個集合,但它沒有提供檢索或操縱單一數組成員的方法。

我們回到本章的重點,迭代器設計模式的實現。下列 UML 類圖顯示了 GoF 迭代器模式與 Media 和 Library 類結合使用鞏固示例的方法。

共4頁上一頁1234下一頁
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杭锦旗| 门源| 江口县| 罗山县| 黎平县| 贺兰县| 舟曲县| 施甸县| 连城县| 于田县| 南汇区| 澄城县| 双江| 安丘市| 全州县| 米易县| 沅陵县| 综艺| 文山县| 瓦房店市| 大庆市| 沙雅县| 当涂县| 睢宁县| 舞阳县| 扎兰屯市| 凤台县| 乌拉特前旗| 搜索| 孝义市| 海门市| 克什克腾旗| 仁寿县| 阿克苏市| 商丘市| 乌鲁木齐县| 吉林市| 玛多县| 潮州市| 宁夏| 宁乡县|