2015年3月13日 星期五

Composite

目的

Decouple an abstraction from its implementation so that the two can vary independently.
(將物件組織成樹狀結構、「部分-全體」層級關係,讓外界以一致性的方式對待個別物件和整體物件。[1])



在電腦中最常看到的樹狀結構就是檔案系統中的檔案與資料夾,資料夾像是檔案,可以執行、重新命名、排列⋯⋯。然而資料夾裡面卻可以還有許多檔案或者資料夾,執行資料夾則是打開資料夾。對於檔案系統而言,我們希望可以一致性對待資料夾和檔案,讓程式碼相對簡潔。

Composite design pattern 便是對於這種樹狀結構一個好的解法。Composite design pattern 可以:
  1. 遞回複合(Recursive composition):例如資料夾裡面可以有許多資料夾。
  2. 讓一對多的擁有關係(has a)變成繼承關係(is a),大大簡化程式複雜度。
  3. 因為是繼承關係,可以一致性對待單一物件或者是複合物件。
 Composite 的 UML Class Diagram:

範例程式:


範例程式與 Class Diagram 的對應關係:
  • Client <==> main
  • Component <==> Item
  • Leaf <==> OpenFileItem, NewFileItem, FileItem
  • Composite <==> Menu, OpenRecentFilesMenu
Composite design pattern 是一個運用在樹狀結構上簡單好用的 Pattern,以後遇到樹狀結構的問題,可以運用 Composite 來讓程式更加簡潔


[1] "物件導向設計模式", Gamma, Johnson, Helm, Vlissides 著, 葉秉哲譯
[2] "Composite Design Pattern", http://sourcemaking.com/design_patterns/composite