參數(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è)目的地的列表,并且列表顯示出滿足“足夠溫暖”標(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)更多額外的自由和靈活性。
出處:
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之規(guī)范模式 [2] 下一頁(yè) php設(shè)計(jì)模式介紹之規(guī)范模式 [4]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|