php設(shè)計模式介紹之值對象模式第2/5頁
更新時間:2008年04月13日 22:10:17 作者:
在所有的最簡單的程序中,大多數(shù)對象都有一個標識,一個重要的商業(yè)應(yīng)用對象,例如一個Customer或者一個SKU,有一個或者更多的屬性---id,name,email地址,這樣可以把它從同一個類的其他實例區(qū)分開來。此外,對象有一個恒定的標識:它是貫穿于整個應(yīng)用程序的一個唯一的標識,對于程序員來說,”customer A”在任何地方就是”customer A”,并且只要你的程序在持續(xù)運行時"customer A"仍然是"customer A"。 但是一個對象不需要有一個標識。有些對象僅僅是為了描述其他對象的屬性。
問題:
那么,你該如何為Date或Dollar這樣一些描述簡單的應(yīng)用定義一個高效的類,并且易于創(chuàng)建呢。
解決方案:
高效的對象應(yīng)該像PHP的整型那樣運作:如果你把同一個對象資源賦值給兩個不同的變量,然后改變其中的一個變量,另一個變量仍然不受影響。事實上,這就是Value Object模式的目標所在。
執(zhí)行Value Object時,php4和php5是有區(qū)別的。
正如以上你所看到的,PHP5通過new進行對象資源的賦值傳遞的是對象資源的指針就像我們在PHP4中通過指針傳遞一樣。很明顯,這是一個問題。為了解決那個問題并實現(xiàn)一個專有對象Dollar的值,我們必須使屬性$amount的對象的所有屬性的一個值在一般情況下不可變或不能改變。但是在PHP語言的沒有提供參數(shù)不可改變的功能的情況下,你完全可以結(jié)合屬性的可見性與獲得和設(shè)置方法來實現(xiàn)。
相反地,PHP4操作所有的對象都是遵循Value Objects對象規(guī)律的,因為PHP4的賦值操作相當于對對象做了一個拷貝。所以為了在PHP4中實現(xiàn)Value Objects設(shè)計模式你需要打破你細心地培養(yǎng)的通過指針賦值來創(chuàng)建、傳遞、提取對象的習慣。
注:術(shù)語 不可變的(Immutable):
在詞典中Immutable的定義是不允許或不易受影響。在編程中,這個術(shù)語表示一個一旦被設(shè)置就不能改變的值。
PHP5 樣本代碼:
既然我們開始用PHP5編寫代碼,讓我們優(yōu)化一個PHP5的Value Object的實例并創(chuàng)建一個較好的Dollar類定義。命名在面向?qū)ο缶幊讨蟹浅V匾?,選擇一個唯一的貨幣類型作為這個類的名字,說明它不被定義為可以處理多種貨幣類型的類。
class Dollar {
protected $amount;
public function __construct($amount=0) {
$this->amount = (float)$amount;
}
public function getAmount() {
return $this->amount;
}
public function add($dollar) {
return new Dollar($this->amount + $dollar->getAmount());
}
}
類里面的屬性如果加上protected前綴,別的類是訪問不了的。protected(和private)拒絕通過屬性直接被訪問。
通常,當你使用面向?qū)ο筮M行編程的時候,你經(jīng)常需要創(chuàng)建了一個“setter”函數(shù),就類似于:
public setAmount($amount)
{
$this->amount=$amount;
}
一樣,在這種情況下,雖然沒有設(shè)定函數(shù)Dollar::amount(),但在對象的實例化期時,參數(shù)Dollar::amount就已經(jīng)被賦值了。而函數(shù)Dollar::getAmount()只是提供一個訪問Dollar屬性的功能,在這里訪問的數(shù)據(jù)類型為浮點型。
最有趣的變化是在Dollar::add()方法函數(shù)中。并不是直接改變$this->amount變量的值從而會改變已存在的Dollar對象實例,而是創(chuàng)建并返回一個新的Dollar實例?,F(xiàn)在,盡管你指定當前對象給多個變量,但是每一個變量的變化都不會影響其它的變量實例。
對于價值設(shè)計模式不變性是關(guān)鍵,任何對于一個Value Object的變量amount的改變,是通過創(chuàng)建一個新的帶有不同預(yù)期值的類的實例來完成的。上文中提高的最初那個$this->amount變量的值從未改變。
簡單來說,在PHP5里面使用價值設(shè)計模式時,需要注意以下幾個方面:
保護值對象的屬性,禁止被直接訪問。
在構(gòu)造函數(shù)中就對屬性進行賦值。
去掉任何一個會改變屬性值的方式函數(shù)(setter),否則屬性值很容易被改變。
以上三步創(chuàng)建了一個不變的值,這個值一旦被初始化設(shè)置之后就不能被改變。當然,你也應(yīng)該提供一個查看函數(shù)或者是訪問Value Object的屬性的方法,并且可以添加一些與這個類相關(guān)的函數(shù)。值對象并不是只能用在一個簡單的架構(gòu)上,它也可以實現(xiàn)重要的商務(wù)邏輯應(yīng)用。讓我們看看下一個例子:
您可能感興趣的文章:
- php設(shè)計模式 Observer(觀察者模式)
- php設(shè)計模式 Singleton(單例模式)
- php設(shè)計模式 Command(命令模式)
- php設(shè)計模式 Composite (組合模式)
- php設(shè)計模式 Bridge (橋接模式)
- php設(shè)計模式 Chain Of Responsibility (職責鏈模式)
- php設(shè)計模式 Mediator (中介者模式)
- php設(shè)計模式 Prototype (原型模式)代碼
- php設(shè)計模式 Command(命令模式)
- 介紹php設(shè)計模式中的工廠模式
- php設(shè)計模式介紹之編程慣用法
- php設(shè)計模式 Strategy(策略模式)
- php設(shè)計模式 FlyWeight (享元模式)
- php設(shè)計模式 State (狀態(tài)模式)
- php設(shè)計模式 Proxy (代理模式)
- php設(shè)計模式 Template (模板模式)
相關(guān)文章
簡單介紹win7下搭建apache+php+mysql開發(fā)環(huán)境
這里給大家介紹的是Win7下搭建“PHP+Apache+MySql”網(wǎng)站運行環(huán)境詳細方法步驟,十分的細致全面,有需要的小伙伴可以參考下。2015-08-08在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的運行環(huán)境
這篇文章主要介紹了在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的運行環(huán)境,需要的朋友可以參考下2016-04-04php實現(xiàn)Linux服務(wù)器木馬排查及加固功能
這篇文章主要介紹了php實現(xiàn)Linux服務(wù)器木馬排查及加固功能,本文給出了根據(jù)特征碼查找、搜索最近被修改的文件、修改php.ini、修改nginx.conf等方法,需要的朋友可以參考下2014-12-12php中g(shù)et_object_vars()方法用法實例
這篇文章主要介紹了php中g(shù)et_object_vars()方法用法,實例分析了get_object_vars()方法獲取對象中屬性的使用技巧,需要的朋友可以參考下2015-02-02