合成(Composite)模式的结构图
合成模式是将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与符合元素同等看待。在如下情况下使用合成模式:
1、需要描述对象的部分和整体的等级结构2、需要客户端忽略掉个体构件和组合构件的区别。客户端必须平等对待所有的构件,包括个体构件和组合构件。
合成模式有两种形式,分别为安全式和透明式
透明式
在Component里面声明所有的用来管理子类对象的方法,包括add()、remove(),以及getChild()方法。这样做的好处是所有的构件类都有相同的接口。在客户端看来,树叶类对象与合成类对象的区别起码在接口层次上消失了,客户端可以同等的对待所有的对象。这就是透明形式的合成模式。其缺点是不够安全,因为树叶类对象和合成类对象在本质上是有区别的。树叶类对象不可能有下一个层次的对象,因此add()、remove()以及getChild()方法没有意义。
安全式
在树枝结构Composite类里面声明所有的用来管理子类对象的方法。这样的做法是安全的。缺点是不够透明,因为树叶类和合成类将具有不同的接口。
二、合成模式在Java中的应用
由于AWT和Swing的图形界面构件是建立在AWT库中的Container类和Component类上的,从下面的AWT合成模式类图可以看出,Button和Checkbox是树叶型的构件,而Container则是树枝型的构件。如下图所示:
在Container类中,有操作聚集的对应方法,而在Component类中则没有这样的方法。这就是说,AWT中使用的合成模式是安全形势的合成模式。