《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(2)_PHP教程
推薦:《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 { |
現(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 查
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶(hù)端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-《PHP設(shè)計(jì)模式介紹》第十章 規(guī)范模式(2)
。