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