如果以繪圖為例的話,一個(gè)文字是一個(gè)繪圖元件,一個(gè)線段是一個(gè)繪圖元件,而一個(gè)長(zhǎng)方形也是一個(gè)繪圖元件,這些繪圖元件可以組成一個(gè)圖片,如果將這個(gè)圖片也視作一個(gè)繪圖元件,則這麼遞迴繪圖下去,就可以組合成一個(gè)較大的、複雜的圖形元件,這樣的目的可以使用Composite模式來解決。
對(duì)於使用者而言,無論是文字、線段或長(zhǎng)方形,甚至是組合後的圖片元件,它們都擁有一個(gè)共同的行為,使用者基本上並不會(huì)感覺出它們之間的操作有任何的不同,您可以拖曳、放大、縮小等等,這些行為都是一致的。
以 UML 來表示上面這個(gè)例子的結(jié)構(gòu):
對(duì)於Text、Line與Rectangle而言,Picture是一個(gè)容器,然而Picture繼承Graphic類,所以它也是一個(gè)繪圖元件,您可以進(jìn)一步的將Picture組合至另一個(gè)Picture中,以形成較大的、複雜的圖形。
組合模式的UML結(jié)構(gòu)圖如下所示:
依此架構(gòu),您可以遞迴的組合圖形元件,例如:
除了繪圖元件之外,一些具有層次性或組合性的物件也可以使用Composite模式,像是電路元件、設(shè)備元件等等,使用Composite模式可以大大減低這些元件設(shè)計(jì)的複雜度。