合成模式屬于對象的結構模式,有時又叫做“部分——整體”模式。
合成模式将對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式可以使用戶端将單純元素與複合元素同等看待。
安全式合成模式的結構
涉及到三個角色
● 抽象構件(Component)角色:這是一個抽象角色,它給參加組合的對象定義出公共的接口及其預設行為,可以用來管理所有的子對象。合成對象通常把它所包含的子對象當做類型為Component的對象。在安全式的合成模式裡,構件角色并不定義出管理子對象的方法,這一定義由樹枝構件對象給出。
● 樹葉構件(Leaf)角色:樹葉對象是沒有下級子對象的對象,定義出參加組合的原始對象的行為。
● 樹枝構件(Composite)角色:代表參加組合的有下級子對象的對象。樹枝構件類給出所有的管理子對象的方法,如add()、remove()以及getChild()。
demo
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SYhRGOxUzN1UjZlNjYjljY3ITZhhzMzMjMlRDZmBTY28CXwEzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
可以看出,樹枝構件類(Composite)給出了addChild()、removeChild()以及getChild()等方法的聲明和實作,而樹葉構件類則沒有給出這些方法的聲明或實作。這樣的做法是安全的做法,由于這個特點,用戶端應用程式不可能錯誤地調用樹葉構件的聚集方法,因為樹葉構件沒有這些方法,調用會導緻編譯錯誤。
安全式合成模式的缺點是不夠透明,因為樹葉類和樹枝類将具有不同的接口。
透明式合成模式的結構
與安全式的合成模式不同的是,透明式的合成模式要求所有的具體構件類,不論樹枝構件還是樹葉構件,均符合一個固定接口。
demo
用戶端類的主要變化是不再區分Composite對象和Leaf對象。