當你在不斷的試圖從你的應用程式中發現新的特徵時,你是否發現你提出的解決方法和一些以前你已經實現的東西是如此的類似呢?如果你是乙個程式設計師(即使你才 開始很短的時間),你都可能回答「是」。這看起來就是你使用了一些以前的**來解決軟體開發過程中新發現的問題了。你可能已經認識到:你的解決方法是基本 原理,是乙個不僅僅是你而且是所有專業開發者都能廣泛重複應用的方法。
事實上,許多程式問題都不斷的反覆的遇到,而且許多用來解決這些問題的基本方法(或者說是設計模式)都已經浮現出來。設計模式就是乙個教你如何利用真實可靠的設計來組織你的**的模板。
設計模式歷史
「設計模式」這個術語最初被設計用於建築學領域。christopher alexander 在他1977的著作「a pattern language :towns/building/construction」裡面描述了一些常見的建築學設計問題,並解釋了如何用這些已有的,著名的模式集合來開始全新 的有效的設計。alexander的觀點被很好的轉化到軟體開發上來,並且長期的合意的用原有的元件來構造新的解決方案。
所有的設計模式都有一些常用的特性:乙個標識(a name),乙個問題陳述(a problem statement)和乙個解決方案(a solution)。
乙個模式是解決特定問題的有效方法。乙個設計模式不是乙個庫(能在你的專案中直接包含和使用的**庫)而是乙個用來組織你的**的模板。事實上,乙個**庫和乙個設計模式在應用上是有很多不同的。
比如,你從店鋪裡面買的一件襯衫是乙個**庫,它的顏色,樣式和大小都由設計師和廠商決定,但它滿足了你的需求。
然而,如果店裡面沒有什麼衣服適合你,那你就能自己建立自己的襯衫(設計它的形狀,選擇布料,然後裁縫在一起)。但是如果你不是乙個裁縫,你可能會發現自 己很容易的去找乙個合適的模式然後按著這個模式去設計自己的襯衫。使用乙個模型,你可以在更少的時間內得到乙個熟練設計的襯衫。
回到討論軟體上來,乙個資料提取層或者乙個cms(content management system)就是乙個庫——它是先前設計好而且已經編碼好了的,如果它能準確的滿足你的需要那它就是乙個好的選擇。但如果你正在讀這本書,可能你會發現 庫存的(原有的)解決方案並不是總是對你有效。至今你知道什麼是你所要的,而且你能夠實現它,你僅僅需要乙個模型來引導你。
最後乙個想法:就象乙個裁縫模型,乙個設計本身而言是沒有什麼用處的。畢竟,你不可能穿乙個服裝模型——它僅僅是由很薄的紙拼湊起來的。類似的,乙個軟體設計模型也僅僅只是乙個引導。它必須根據程式語言和你的應用程式的特點和要求而特別的設計。
本書的目標
本書的目的不是為了全面的介紹各種類別的軟體設計模式,也不是為了發展乙個新的設計模式或者術語,而是為了突出介紹一些已有的著名的設計模式。這本書的 獨特之處在於介紹了一些我認為對開發動態web應用程式很有幫助的設計模式,而且用php語言顯示了如何實現這些設計模式。
面對物件程式設計oop
這本書乙個優點就是所有的觀點都是基於oop這種很自然的設計模式,並且用oop來實現。
如果你不熟悉oop,有很多相關的資源(書籍,**,雜誌,上課等等)來幫助你更好的了解它。大多數oop資料都讚美它的好處——**重用,**健壯,代 碼封裝,多型和可擴充套件性,當然所有的這些也是非常重要和有用的。然而,我認為oop最主要的優點是它如何激勵你親手將問題分解成易處理的模組。清晰的設計 和實現,分解成小的模組,這樣你的**能夠得到更加徹底的測試而且也更加容易理解和維護。
讀者技能要求
這本書假定你已經能夠流暢的使用php了。特別地,這本書假設你已經了解了php和php語法的運作知識而且懂得用oop執行php**的基本原理。這本書不是一本php程式設計的介紹書,也不是為了介紹php的oop程式設計的。
由於不是所有的oop開發者都使用相同的術語,當有新的術語被引入時,我都將在正文中或者工具條中定義。
php4和php5
當我寫這本書的時候,php5已經發行有一段時間了,但是還沒有被公眾團體廣泛的採用。在我自己的工作上,我已經開始把新的應用程式開發工作遷移到 php5.0.3的環境中,而且到目前為止我很高興的發現php5對php4的**具有很好的向後相容性,同時它的面對物件模型是php5最有意義的新特徵之一。
有很多很好的文章和指導手冊來處理不同php版本之間的物件模型之間的細微差別。但簡單來說,php5提供了:
php5也提供了一些更加模糊的特徵:
新的魔術方法?
物件柄 php5最好的特性就是採用控制代碼來定義類,類似於乙個檔案或者資料庫控制代碼。在php函式中使用物件不再是含蓄的複製這個物件,而是提供乙個操作控制代碼。
為了更加清楚的看出其間的不同,我們考慮下面兩個例子:
// php4 class
class examplep1
function getfoo()
}function changeexample($param)
$obj = new examplep1;
$obj->setfoo(『bar』);
echo $obj->getfoo(); // bar
echo changeexample($obj); //blah
echo $obj->getfoo(); // bar
在php4中,函式changeexample()中的變數$param是$obj的乙個複製,所以,這個函式沒有改變原來物件中的$foo的值,這樣$obj->getfoo()最終輸出的是』bar』。
在php5中,由於$obj在函式中只是乙個物件操作柄,同樣的changeexample()函式確確實實的影響了原來的物件。換句話說,使用操作柄,就不再需要去複製了而$param就是$obj例項。
// php5 class
class examplep2
function getfoo()
}$obj = new examplep2;
$obj->setfoo(『bar』);
echo $obj->getfoo(); // bar
echo changeexample($obj); //blah
echo $obj->getfoo(); // important, produces blah
當你在其他的物件或者這個物件內建的建構函式(__construct)裡面使用$this這個變數時,這個問題會變的更加的複雜。
結果是在php4中,你幾乎總需要:
事實上,現在有些情況下你也需要複製原始物件。在我的php4**裡面,我總是把任何無引用的物件任務比如為乙個明顯的物件複製注釋的很清楚。從長 期來說,這樣的乙個簡短的注釋能夠極大的減輕任何乙個維護你**的人的頭痛(譯者注:這樣的**可維護性很強)。引用傳值,物件柄和物件複製的相關知識將 在第二章「物件模式的價值」裡面詳細講解。
儘管我個人很偏向於使用php5開發,但我感覺到php4將繼續被我們使用相當長的一段時間,而且現有的公開發布的專案也將繼續支援php4。所以,本 書對兩種版本的php提供相同的支援。盡可能的提供了php4,php5兩個版本的例項**。在每一章裡面,每乙個**塊(在不同的php版本中有所改動 的)中都提供有相應的注釋來暗示其改變,比如//php4和//php5。
參考書目和其他資源
這裡有很多相關的參考書來幫助你更好的學習設計模式。設計模式的「聖經」(譯者譯:最好的書)是erich gamma, richard helm, ralph johnson和john vlissides(他的開創性作品經常被提及為「gang of four」簡寫為」gof」,就是代表他們四個人)撰寫的《設計模式:可重用的面對物件軟體開發原理》。
關於「設計模式」,下乙個最有用的關於php web應用程式設計模式方面的書就是martin fowler出版的patterns of enterprise application architecture (譯者譯:企業應用程式體系結構模型)。與gof的書包含了所有一般的設計模式相比,fowler的這本書詳細的介紹了許多專門用於開發web應用程式的 設計模式。
程式設計模式之前言
首先,我們須要帶著三個問題,來研究清楚 設計模式 是怎麼一回事,來龍去脈。一.什麼是程式設計模式?答 設計模式是一套被反覆使用的 多數人知曉的 經過分類編目的 設計經驗的總結。設計模式是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和錯...
領域驅動設計之 前言
2004年eric evans 發表domain driven design tackling complexity in the heart of software.領域驅動設計 軟體核心複雜性應對之道。通過標題很容易找到一些標籤 領域,核心,複雜性。領域,維基百科給出的解釋是 指某一專業或事物方...
php設計 PHP常用設計模式
1 單例模式指在整個應用中只有乙個物件例項的設計模式 class single public rand static private instance 類直接呼叫 final private function construct private防止外部new this rand mt rand 1,...