将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
• 你想表示对象的部分-整体层次结构。
• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也可实现所有类共有接口的缺省行为。
——树叶构件角色(Leaf):在组合中表示叶节点对象,没有子节点,实现抽象构件角色声明的接口。
——树枝构件角色(Composite):在组合中表示分支节点对象,有子节点,实现抽象构件角色声明的接口;存储子部件。
——透明式的组合模式:将管理子构件的方法定义在Component接口中,这样Leaf类就需要处理这些对其意义不大的方法(空实现或抛异常),在接口层次上Leaf和Composite没有区别,即透明性。Component 声明的这些管理子构件的方法对于Leaf来说是不适用的,这样也就带来了一些安全性问题。
——安全式的组合模式:将管理子构件的方法定义在Composite中,这样编译时任何从Leaf 中增加或删除对象的尝试都将被发现,但是由于Leaf和Composite有不同的接口(方法),又失去了透明性。
将管理子构件的方法定义在Composite中,即安全式的组合模式
public interface Component { public void doSomething(); }
public class Leaf implements Component { @Override public void doSomething() { System.out.println("Leaf doSomething"); } }
public class Composite implements Component { List<Component> childs = new ArrayList<Component>(); public void add(Component child) { this.childs.add(child); } public void remove(Component child) { this.childs.remove(child); } public Component getChild(int i) { return this.childs.get(i); } @Override public void doSomething() { for (Component child : childs) child.doSomething(); } }
public class Client { public static void main(String[] args) { /** * composite1 * / \ * leaf1 composite2 * / \ * leaf2 leaf3 * * */ Component leaf1=new Leaf(); Component leaf2=new Leaf(); Component leaf3=new Leaf(); Composite composite1=new Composite(); Composite composite2=new Composite(); composite2.add(leaf2); composite2.add(leaf3); composite1.add(leaf1); composite1.add(composite2); composite1.doSomething(); } }
1.组合模式让我们能用树形方式创建对象的结构,树里面包含了Composite以及Leaf的对象。使用组合结构,我们能把相同的操作应用在Composite和Leaf上,即大多数情况下,我们可以忽略Composite和Leaf之间的差别,以相同的方式使用它们。为了保持透明性,Leaf和Composite都要继承或实现Component。
2.让管理子构件的方法如add()、remove()、getChild()等出现在Leaf中,是因为我们可以将Leaf看作是没有子构件的节点。
3.《设计模式》一书认为:在组合模式中,相对于安全性,我们比较强调透明性。对于透明式的组合模式中的Leaf内不需要的方法可以使用空处理或者异常报告的方式来解决。
4.Component中可以有一个指向父亲的指针,以便在游走时更容易。比如删除树形结构中的某个子树或叶节点(即Composite或Leaf)时会更加方便。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8946607