定义
讲对象组织到树结构中,用来描述整体和部分的关系。也叫部分-整体模式。合成模式可以使客户端讲单纯元素与复合元素同等看待。即合成模式把部分和整体的关系用树结构表示出来,使得客户端把一个个单独的成分对象和由这些成分对象组成的合成对象同等看待。
组成
抽象构件角色(Component):抽象角色,给参加组合的对象规定一个接口,给出共有的接口及其默认行为。
树叶构件角色(Leaf):代表参与组合的树叶对象。树叶没有下级的子对象。定义出参加组合的原始对象的行为。
树枝构件角色():代表参与组合的有子对象的对象,并给出树枝构件对象的行为。
分类
组合模式根据实现接口的不同分为两种形式:
1)安全式
安全式的合成模式要求管理聚集的方法只出现在树枝构件的类中。这中结构的组成为:
抽象构件角色(Component):抽象角色,给参加组合的对象定义默认的行为和公共接口。可以管理所有的子对象。构件角色并不定义管理子对象的方法,这一定义有树枝构件对象给出。
树叶构件角色(Leaf):没有下级子对象,定义出参加组合的原始对象行为。
树枝构件角色(Composite):代表参与组合的下级子对象的对象。给出所有的管理子对象的方法。
interface Component{ Composite getConposite(); void sampleOperation(); } class Composite implements Component{ private Vector<Component> componentVector = new Vector<Component>(); public Composite getConposite() { return this; } public void sampleOperation() { Enumeration<Component> enumeration = components(); while(enumeration.hasMoreElements()){ enumeration.nextElement().sampleOperation(); } } public void add(Component component){ componentVector.addElement(component); } public void remove(Component component){ componentVector.removeElement(component); } public Enumeration<Component> components(){ return componentVector.elements(); } } class Leaf implements Component{ public Composite getConposite() { return null; } public void sampleOperation() { System.out.println("to do operation"); } }
2)透明式
透明式要求所有的具体构件类,无论树枝还是树叶都符合一个固定的接口。
interface Component{ Composite getConposite(); void sampleOperation(); void add(Component component); void remove(Component component); Enumeration<Component> components(); } class Composite implements Component{ private Vector<Component> componentVector = new Vector<Component>(); public Composite getConposite() { return this; } public void sampleOperation() { Enumeration<Component> enumeration = components(); while(enumeration.hasMoreElements()){ enumeration.nextElement().sampleOperation(); } } public void add(Component component){ componentVector.addElement(component); } public void remove(Component component){ componentVector.removeElement(component); } public Enumeration<Component> components(){ return componentVector.elements(); } } class Leaf implements Component{ public Composite getConposite() { return null; } public void sampleOperation() { System.out.println("to do operation"); } public void add(Component component){ } public void remove(Component component){ } public Enumeration<Component> components(){ return null; } }
树叶类给出了add()、remove()、compnents()等方法的实现,但是这些方法其实不适用树叶类。
参考:
《Java与模式》