首頁 > Zend Framework > Patterns in Zend Framework

Patterns in Zend Framework

2010年7月22日 jaceju 發表評論 閱讀評論

這次在 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 實際應用到底是什麼樣子。如果大家覺得有任何疑慮的地方,都歡迎一起討論。

Categories: Zend Framework Tags:
  1. 2010年7月22日15:35 | #1

    站長您好請問一下PHP 讀書會是在哪邊有舉辦呢?

  2. 2010年7月24日19:23 | #2

    总结的不错。我再补充一些:
    Decorator Pattern 在 ZF 里面的一个应用就是 Zend_Layout 对 Zend_View 装饰。Zend_Log 里面用到了 Observer Pattern。Zend_Log 接收到客户端发来的信息后以 log() 方法通知各个 writer。

    欢迎其他同学继续补充~

  3. pjt
    2010年7月27日09:25 | #3

    ZF在產生HTML Form的地方大量使用了Decorator.到Form目錄下grep -R -i decorator *.php就會看到一堆了.

  4. jaceju
    2010年7月27日10:00 | #4

    @pjt:

    之所以沒有把 Zend_Form 納入 Decorator Pattern 是因為其實 Zend_Form 的 Decorator 在實作上並不是用傳統的 Decorator Pattern ,而是偏向於 Strategy Pattern ,這在官方手冊裡有提到。

    http://framework.zend.com/manual/en/learning.form.decorators.intro.html

  5. jaceju
    2010年7月27日10:01 | #5

    @Ben:

    感謝補充。 :)

  1. 目前尚無任何 trackbacks 和 pingbacks。

Spam Protection by WP-SpamFree