淺析設計模式:複合模式(Composite)

    在計算機的文件系統中,文件和文件夾可以統稱爲目錄條目,文件夾中可以放入文件,也可以放入其他文件夾(子文件夾),而子文件夾中同樣可以放入文件或是子文件夾。這樣文件夾實際上形成了一種容器結構、遞歸結構

    有時,與將文件和文件夾都看作是目錄條目一樣,將容器與內容作爲同一種東西看待能夠幫助我們方便的處理問題

   能夠使"容器"與"內容"具有一致性,創造出遞歸結構的模式就是複合模式(Composite)。

複合模式中的角色:

  • Leaf(樹葉):表示"內容"的角色,該角色中不能放入其他對象。
  • Composite(複合物):表示"容器"的角色,Composite中既可以放入Leaf,也可以放入其他Composite。
  • Component(組件):是Leaf和Composite具有一致性的角色,Component是Leaf和Composite的父類。
  • Client:使用Composite模式的角色。

複合模式的類圖:

我們使用Composite模式來模擬一下文件系統:

1、編寫Component角色

AbstractEntity表示目錄條目,它是文件和文件夾的父類。


2、編寫Leaf:

File類表示文件


3、編寫Composite角色:

Directory類表示文件夾


4、編寫測試程序

我們來創建如下入所示的目錄結構:



    上面的代碼不難理解,但是釐清Composite模式我們需要注意這幾個要點:

  • 一致性:File類和Directory類都是AbstractEntity類的子類,一致性體現在什麼地方?以Directory類的getSize方法爲例,遍歷每一個目錄條目的過程中你不需要判斷每一個條目具體是文件還是文件夾,實際上無論是文件還是文件夾都可以直接使用getSize方法獲取其大小,只不過文件夾的getSize方法隱含了遞歸的過程。反過來看,若File與Directory不具備一致性,那麼文件夾的getSize方法怎麼實現?你需要在在目錄條目遍歷的過程中,判斷每一個條目的類型,若是文件則直接累加其大小,若是文件夾,則再遍歷其所包含的目錄條目...
  • 容器結構:Directory類就是一個容器,其files屬性可以存儲File或其他Directory。
  • 遞歸結構:Directory類的getSize方法和pringList方法都隱含了遞歸調用的過程。

Ending ...奮鬥


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章