1.含义
合成模式把部分和整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由它们复合而成的合成对象同等看待。
2.类图
安全式和透明式的合成模式
安全式的合成模式:
叶子节点中没有管理聚集的方法,只有合成对象里才有。
透明式的合成模式:管理聚集的方法被移动到了接口中,叶子和合成对象都有这些方法,相对透明但不安全,叶子并不需要那些方法,一般实现了也是空方法体。
3.类代码
安全式的
/* * 抽象构件角色 */ public interface Component { Composite getComposite(); void sampleOperation(); } /* * 树枝构件角色 */ public class Composite implements Component { private Vector componentVector = new java.util.Vector(); public Composite getComposite() { return this; } public void sampleOperation() { Enumeration e = components(); while (e.hasMoreElements()) { ((Component) e.nextElement()).sampleOperation(); } } public void add(Component c) { componentVector.addElement(c); } public void remove(Component c) { componentVector.removeElement(c); } public Enumeration components() { return componentVector.elements(); } } /* * 树叶构件角色 */ public class Leaf implements Component { public void sampleOperation() { } public Composite getComposite() { return null; } } /* * 测试类 */ public class Test { public static void main(String[] args) { Composite c = new Composite(); Leaf l = new Leaf(); c.sampleOperation(); l.sampleOperation(); c.add(c); } }
透明式的
/* * 抽象构件角色 */ public interface Component { void sampleOperation(); Composite getComposite(); void add(Component c); void remove(Component c); Enumeration components(); } /* * 树枝构件角色 */ public class Composite implements Component { private Vector componentVector = new java.util.Vector(); public Composite getComposite() { return this; } public void sampleOperation() { Enumeration e = components(); while (e.hasMoreElements()) { ((Component) e.nextElement()).sampleOperation(); } } public void add(Component c) { componentVector.addElement(c); } public void remove(Component c) { componentVector.removeElement(c); } public Enumeration components() { return componentVector.elements(); } } /* * 树叶构件角色 */ public class Leaf implements Component { public void sampleOperation() { } public Composite getComposite() { return null; } public void add(Component c) { } public void remove(Component c) { } public Enumeration components() { return null; } } /* * 测试类 */ public class Test { public static void main(String[] args) { Composite c = new Composite(); Leaf l = new Leaf(); c.sampleOperation(); l.sampleOperation(); c.add(c); l.add(c); } }
z