Patterns in Zend Framework
這次在 PHP 讀書會裡嘗試介紹 Zend Framework 裡的 Patterns ,讓大家實際去體會 Pattern 在實際項目上的應用,瞭解大師們是怎麼透過 Pattern 去解決問題。
然而我沒辦法把所有的 Patterns 都找出來,因此就挑了幾個常見的 Patterns 來介紹。
以下是這次使用的投影片。
補充
Strategy Pattern 與 Adapter Pattern
在 Zend_Cache 中,確實也用到了 Adapter Pattern 。那麼怎麼區分 Strategy Pattern 及 Adapter Pattern 呢?要從兩個地方去分辨: Pattern 的目的,以及觀看程式的角度。
Strategy Pattern 的目的在於讓數個策略可以互相抽換;而 Adapter 的目的是讓第三方套件可以整合到現有的系統裡,而不必修改
系統的操作方式。
在 Zend_Cache 的例子中,我們可以從兩個方向去看出 Pattern 的樣子。從 Zend_Cache_Core 的面向來看,它可以抽換不同的 Backend ,所以從這個角度來看是採用 Strategy
Pattern 。
再從 Zend_Cache_Backend_Memcached 的面向來看,它轉接了 Memcached 這個 extension ,所以可以
說是 Adapter Pattern 。而 Zend_Cache_Backend_File 則是在內部自行實作,所以就不是 Adapter Pattern 了。
Decorator Pattern 與 Composite Pattern
這次雖然沒有介紹 Decorator Pattern (主要是很難找到好的例子) ,但有朋友問到了 Decorator Pattern 和 Composite Pattern 之間有什麼差別?
Decorator Pattern 和 Composite Pattern 主要都是想讓類別的組合可以被 Client 一視同仁地去操作。
較大的不 同點在於 Decorator 內部是包含單一個體,而 Composite 內部是包含群體。
Decorator 的方法被呼叫時,它會先取得內部個體同一個方法的結果,然後再做部份的修飾;而 Composite 的方法被呼叫時,它則是會一一呼叫內部節點的同名方法來執行,而不會再加入其他修飾。
所以如果真的要嚴格看待 Zend_Filter 的話,它其實多少有些 Decorator 的影子,只是實作上偏向於 Composite 。
心得
這次花了很多時間在看 Zend Framework 的程式碼,然而我卻發覺我很難在 Zend Framework 裡去找到一個完全符合 Pattern 理論的例子。
一來 Patterns 本來就沒有固定的形,要用書上講的例子去比對,其實相當困難;二來 Patterns 通常是交織在一起使用,所以要介紹單一個 Pattern 的話,就很容易讓聽眾跟其他的 Pattern 混淆在一起。
總之這次算是一個試金石,目的就是讓大家瞭解 Pattern 實際應用到底是什麼樣子。如果大家覺得有任何疑慮的地方,都歡迎一起討論。
站長您好請問一下PHP 讀書會是在哪邊有舉辦呢?
总结的不错。我再补充一些:
Decorator Pattern 在 ZF 里面的一个应用就是 Zend_Layout 对 Zend_View 装饰。Zend_Log 里面用到了 Observer Pattern。Zend_Log 接收到客户端发来的信息后以 log() 方法通知各个 writer。
欢迎其他同学继续补充~
ZF在產生HTML Form的地方大量使用了Decorator.到Form目錄下grep -R -i decorator *.php就會看到一堆了.
@pjt:
之所以沒有把 Zend_Form 納入 Decorator Pattern 是因為其實 Zend_Form 的 Decorator 在實作上並不是用傳統的 Decorator Pattern ,而是偏向於 Strategy Pattern ,這在官方手冊裡有提到。
http://framework.zend.com/manual/en/learning.form.decorators.intro.html
@Ben:
感謝補充。