组合模式定义如下:
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,
组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。
组合模式分为透明组合模式和安全组合模式,其分别的UML图如下:
图1-1 透明组合模式
图1-2 安全组合模式
透明组合模式和安全组合模式的区别就是安全组合模式将管理其他组件的功能单独提出,叶子组件不具备管理其他组件的功能。
透明组合模式 abstract class Component { public abstract void add(Component c); //增加成员 public abstract void remove(Component c); //删除成员 public abstract Component getChild(int i); //获取成员 public abstract void operation(); //业务方法 } class Leaf extends Component { public void add(Component c) { //异常处理或错误提示 } public void remove(Component c) { //异常处理或错误提示 } public Component getChild(int i) { //异常处理或错误提示 return null; } public void operation() { //叶子构件具体业务方法的实现 } } class Composite extends Component { private ArrayList<Component> list = new ArrayList<Component>(); public void add(Component c) { list.add(c); } public void remove(Component c) { list.remove(c); } public Component getChild(int i) { return (Component)list.get(i); } public void operation() { //容器构件具体业务方法的实现 //递归调用成员构件的业务方法 for(Object obj:list) { ((Component)obj).operation(); } } }
安全组合模式 abstract class Component { public abstract void operation(); //业务方法 } class Leaf extends Component { public void operation() { //叶子构件具体业务方法的实现 } } class Composite extends Component { private ArrayList<Component> list = new ArrayList<Component>(); public void add(Component c) { list.add(c); } public void remove(Component c) { list.remove(c); } public Component getChild(int i) { return (Component)list.get(i); } public void operation() { //容器构件具体业务方法的实现 //递归调用成员构件的业务方法 for(Object obj:list) { ((Component)obj).operation(); } } }
组合模式为处理树形结构提供了一种较为完美的解决方案,它描述了如何将容器和叶子进行递归组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器和叶子。