定义:允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理 个别对象 以及 对象组合。
角色:
1) 抽象构建角色 (Component)
2) 叶子节点角色 (Leaf)
3) 组合构建角色 (Composite)
4) 客户端 (Client)
Component.java
package com.composite ; import java.util.List ; //抽象构件角色 public interface Component { public void add (Component component) ; public void remove (Component component) ; public void doSomeThing () ; public List<Component> getAll () ; }
Leaf.java
package com.composite ; import java.util.List ; //叶子角色 public class Leaf implements Component { public void add (Component component) { } public void remove (Component component) { } public List<Component> getAll () { return null ; } public void doSomeThing () { System.out.println("hello") ; } }
Composite.java
package com.composite ; import java.util.List ; import java.util.ArrayList ; //组合角色 public class Composite implements Component { private List<Component> list = new ArrayList<Component> () ; public void add (Component component) { list.add(component) ; } public void remove (Component component) { list.remove(component) ; } public List<Component> getAll () { return this.list ; } //隐式递归 如果 遍历后发现component是叶子节点,则打印;反之,隐式递归 public void doSomeThing () { for (Component component : list) { component.doSomeThing() ; } } }
Client.java
package com.composite ; //客户端角色 public class Client { public static void main(String[] args) { //创建两个叶子构件 Component leaf1 = new Leaf () ; Component leaf2 = new Leaf () ; //创建一个组合构件 Component com1 = new Composite () ; com1.add (leaf1) ; com1.add (leaf2) ; //创建两个叶子构件 Component leaf3 = new Leaf () ; Component leaf4 = new Leaf () ; //创建一个组合构件 Component com2 = new Composite () ; //把第一个组件装进第二个组件里 com2.add (com1) ; com2.add (leaf3) ; com2.add (leaf4) ; com2.doSomeThing () ; //com2.remove(com1) ; //com2.remove(leaf2) ;//在这移除不掉leaf2,只能com1.remove(leaf2) //System.out.println(com2.getAll()) ; } }
总结:
优点:
组合模式(Composite)可以让客户端的代码变的简单,不会那么繁琐,一致性的处理单个对象和组合对象
使用组合模式可以很好的增加新的叶子构件
缺点:
控制树枝节点构件不容易