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

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

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

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

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

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

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

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

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

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

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

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

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

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

現(xiàn)在你可以寫(xiě)一個(gè)測(cè)試實(shí)例來(lái)過(guò)濾目的地列表。

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]);
}
}

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

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

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

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

上面每一個(gè)問(wèn)題的答案顯然是肯定的。

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

注:WACT

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

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

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

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)直接通過(guò)一串標(biāo)識(shí)符來(lái)獲取一個(gè)對(duì)象的屬性。方法Set()用來(lái)改變?cè)械膶傩曰蛘邉?dòng)態(tài)的創(chuàng)建新的屬性,方法get()則能返回指定名稱(chēng)的屬性。

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

來(lái)源:模板無(wú)憂(yōu)//所屬分類(lèi):PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程