组合模式定义:组合模式又叫作“部分-整体”模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系。使用户对单个对象和组合对象具有一致的访问性。
如图左边是:组合模式;右边是:装饰者模式。
可见组合模式就是装饰者模式的上半部分。
组合模式的优点有:
1、组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
2、更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
组件接口:
1 public interface Component { 2 public void add(Component component); 3 4 public void remove(Component component); 5 6 public Component getChild(int t); 7 8 public void operation(); 9 }
树叶元素与组合元素:
1 public class Leaf implements Component { 2 private String name; 3 4 public Leaf(String name) { 5 this.name = name; 6 } 7 8 @Override 9 public void add(Component component) { 10 // TODO Auto-generated method stub 11 12 } 13 14 @Override 15 public void remove(Component component) { 16 // TODO Auto-generated method stub 17 18 } 19 20 @Override 21 public Component getChild(int t) { 22 // TODO Auto-generated method stub 23 return null; 24 } 25 26 @Override 27 public void operation() { 28 // TODO Auto-generated method stub 29 System.out.println("树叶" + name + "被访问"); 30 } 31 } 32 33 public class Composite implements Component { 34 private ArrayList<Component> children = new ArrayList<Component>(); 35 36 @Override 37 public void add(Component component) { 38 // TODO Auto-generated method stub 39 children.add(component); 40 } 41 42 @Override 43 public void remove(Component component) { 44 // TODO Auto-generated method stub 45 children.remove(component); 46 } 47 48 @Override 49 public Component getChild(int t) { 50 // TODO Auto-generated method stub 51 return children.get(t); 52 } 53 54 @Override 55 public void operation() { 56 // TODO Auto-generated method stub 57 for (Object obj : children) { 58 ((Component) obj).operation(); 59 } 60 } 61 }
调用方式:
1 public class Client { 2 public static void main(String[] args) { 3 Component c0 = new Composite(); 4 Component c1 = new Composite(); 5 Component leaf1 = new Leaf("1"); 6 Component leaf2 = new Leaf("2"); 7 Component leaf3 = new Leaf("3"); 8 c0.add(leaf1); 9 c0.add(c1); 10 c1.add(leaf2); 11 c1.add(leaf3); 12 c0.operation(); 13 } 14 }
执行结果:
组合模式是树数据结构的体现。