日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(2)_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:《PHP設(shè)計(jì)模式介紹》第九章 觀測模式
一些面向?qū)ο蟮木幊谭绞剑峁┝艘环N構(gòu)建對象間復(fù)雜網(wǎng)絡(luò)互連的能力。當(dāng)對象們連接在一起時,它們就可以相互提供服務(wù)和信息。 通常來說,當(dāng)某個對象的狀態(tài)發(fā)生改變時,你仍然需要對象之間能互

參數(shù)化規(guī)范

Trip Required Temperature Specification必須很熟悉Trip對象的結(jié)構(gòu),并且鉆研Trip對象的三個public(公開)屬性。這并不是很糟糕的。事實(shí)上,在過去使用規(guī)范模式的過程中,我發(fā)現(xiàn)不少規(guī)范得益于我對特有參數(shù)對象的詳細(xì)了解。然而,這種緊密的聯(lián)系對規(guī)范的重用帶來了很大的麻煩。

幸運(yùn)的是,各種不同的規(guī)范模式已經(jīng)開始著手從事代碼重用問題的研究。特別值得提出的是,參數(shù)化規(guī)范模式通過構(gòu)造器(constructor)來接收參數(shù),這個參數(shù)主要用于確定isSatisfiedBy()函數(shù)的進(jìn)化標(biāo)準(zhǔn)。

現(xiàn)在讓我們看看這個參數(shù)化規(guī)范,它使用了相同旅行站點(diǎn)的對象。假定你要搜索出一個目的地的列表,并且列表顯示出滿足“足夠溫暖”標(biāo)準(zhǔn)的城市。

使用原來的Trip Required Temperature Specification,你不得不為每個評估創(chuàng)建一個Trip對象。這是因?yàn)椋ㄔ谶@個明確的問題上)旅行者(Traveler)和旅行日期(Date)是不變的,僅僅只有目的地因?yàn)槟悴粩嗟闹厥隹尚心康牡亓斜矶粩嘧兓?/p>

使用參數(shù)化規(guī)范,你記住了旅行者首選的溫度和旅行日期,并且你只要通過傳遞一個變量到方法isSatisfiedBy()就可以比較目的地。

參數(shù)化規(guī)范對象Destination Required Temperature Specification的構(gòu)造函數(shù)需要一個旅行者(Traveler)和一個日期(Date)來實(shí)例化這個規(guī)范。

class DestinationRequiredTemperatureSpecification {
protected $temp;
protected $month;
public function __construct($traveler, $date) {
$this->temp = $traveler->min_temp;
$this->month = date(‘m’, $date);
}
}

由于存儲在實(shí)例化變量中的數(shù)據(jù)(溫度和日期)的一致性,Destination Required Temperature Specification的方法isSatisfiedBy()把目的地(Destination)做為一個輸入?yún)?shù)來評估。

class DestinationRequiredTemperatureSpecification {
// ...
function isSatisfiedBy($destination) {
return
($destination->getAvgTempByMonth($this->month) >= $this->temp);
}
}

現(xiàn)在你可以寫一個測試實(shí)例來過濾目的地列表。

class DestinationSpecificationTestCase extends UnitTestCase {
// similar setup to TripSpecificationTestCase
function TestFindingDestinations() {
$this->assertEqual(2, count($this->destinations));
$valid_destinations = array();
$vicki = new Traveler;
$vicki->min_temp = 70;
$travel_date = mktime(0,0,0,2,11,2005);
$warm_enough = new DestinationRequiredTemperatureSpecification(
vicki, $travel_date);
foreach($this->destinations as $dest) {
if ($warm_enough->isSatisfiedBy($dest)) {
$valid_destinations[] = $dest;
}
}
$this->assertEqual(1, count($valid_destinations));
$this->assertIdentical(
$this->destinations[‘Cancun’],
$valid_destinations[0]);
}
}

通過上面的例子,你可以看到參數(shù)化規(guī)范能給你帶來更多額外的自由和靈活性。

現(xiàn)在讓我們看看另外一個例子,在這個例子里面數(shù)據(jù)類型和規(guī)范都必須是非常的靈活易變的。

在web應(yīng)用程序中,最常用也最讓人發(fā)狂的一個問題就是確認(rèn)表單輸入(對表單輸入數(shù)據(jù)的驗(yàn)證)。在軟件開發(fā)過程中(甚至在開發(fā)過程外),表單是經(jīng)常改變得,而且在大型的或者功能豐富的應(yīng)用程序里面,表單的數(shù)量能夠很快的增長。你可以創(chuàng)建一個唯一的對象來封裝每一個表單,然后使用規(guī)范模式來確認(rèn)每一個對象,但這絕對是一個持續(xù)的惡夢。

有沒有一個方便的數(shù)據(jù)類型能夠很容易的適應(yīng)任何一個表單嗎?如果有,那么有沒有一個能夠確認(rèn)動態(tài)數(shù)據(jù)類型的方式呢?

上面每一個問題的答案顯然是肯定的。

WEB應(yīng)用程序組件工具箱(簡稱WACT)的數(shù)據(jù)源(DataSource)接口能夠get(獲取),set(設(shè)置),,并且動態(tài)的創(chuàng)建對象屬性(有點(diǎn)類似PHP4的_GET()和_SET()方法),這些對象屬性就是表單的封裝操作手柄。(熟悉JAVA的讀者可以把一個數(shù)據(jù)源(DataSource)理解未JAVA中的哈希圖(HashMap))同時,參數(shù)化規(guī)范模式提供了一個模型以一定的標(biāo)準(zhǔn)來驗(yàn)證一個數(shù)據(jù)源。

注:WACT

WACT,WEB應(yīng)用程序組件工具箱,能夠在SourceForge(http://wact.sf.net)上下載到。它是一個PHP庫類,用來解決在WEB應(yīng)用程序開發(fā)中一些常用的問題。WACT很注重代碼重用、單體測試和使用設(shè)計(jì)模式方面的技術(shù)。WACT理論相關(guān)的信息位于http://wact.sf.net/index.php/datasource

WACT數(shù)據(jù)源(DataSource)類包含在這本書的源代碼里面,這樣你可以方便的測試這些代碼。

在這個例子中,數(shù)據(jù)源(DataSource)類可以被認(rèn)為如下面的代碼所示,它幾乎和第5章開發(fā)的Register(注冊)類完全一樣。

class DataSource {
protected $store = array();
function get($key) {
if (array_key_exists($key, $this->store))
return $this->store[$key];
}
function set($key, $val) {
$this->store[$key] = $val;
}
}

數(shù)據(jù)源(DataSource)直接通過一串標(biāo)識符來獲取一個對象的屬性。方法Set()用來改變原有的屬性或者動態(tài)的創(chuàng)建新的屬性,方法get()則能返回指定名稱的屬性。

分享:《PHP設(shè)計(jì)模式介紹》第八章 迭代器模式
類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實(shí)例化的對象,每個單獨(dú)的對象都有一個特定的身份和狀態(tài)。單獨(dú)的對象是一種組織代碼的有用方法,但通常你會處理一組對象或者集合。 屬性來自 SQL 查

來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關(guān)PHP教程