组合模式:Composite模式

来源:互联网 发布:三国群英2优化版 编辑:程序博客网 时间:2024/04/28 20:45

将对象组合成树形结构以表示部分和整体的层次结构.

组合模式使得用户对单个对象和组合对象的适用具有一致性.


    组合模式是将对象之间的关系以数据结构中的2叉树表现出来,使得客户端将单纯的元素与复杂元素同等看待,这样的话使得用户在操作不同的子类元素时可以和根节点元素一样操作,在透明模式下即根元素和叶元素公用同一个接口达到共同的结果。

组合模式就是解决部分与整体的关系的一种模式。

 

意图

将对象组合成树形结构以表示“整体-部分”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性

动机

客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(非抽象接口)的变化将引起客户代码的频繁变化代码的代码维护和扩展的困难,我们需要将客户代码与复杂的对象容器结构解偶。

适用性

l         想表示对象的部分-整体层次结构

l         希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

结构

 

 

参与者

l         抽象构件(Component)角色                          IComposite              

l         树叶构件(Leaf)角色                (Employees)

l         树枝构件                     (Boss)

Composite模式的优点

1.         客户代码不依赖复杂对象本身的结构变化

2.         用户不需要特别关心复杂对象的具体结构只要等同于根对象操作


先用一个普通的例子来解释一下组合模式. 一个很大的集团公司, 在各个大区开有分公司, 在小地区开有办事处, 一个经理,可以在办事处开展业务, 也可以在分公司工作, 还可以在总公司工作, 这是因为, 不管是总公司, 分公司, 还是办事处, 经理的工作模式基本相同, 而且总公司, 分公司和办事处的外部结构也很相似, 任何一个经过培训的经理, 都可以在总公司, 分公司或办事处工作.  这是因为分公司, 总公司在管理上具有一致的接口.

再举一例, 文件系统中有文件, 也有文件夹(其实是特殊的文件), 文件和文件夹组合在一起, 可以成为一个更大的文件夹. 在用户看来,不管是文件, 还是文件夹, 还是更目录, 对它们的操作都是一致的(当然试图把一个文件夹放到文件下面是不容许的). 这就是说整体和部分具有一致的接口.

 

//公共接口  package designpattern.composite;  public interface Component {      public void add(Component c);      public void remove(Component c);      public void display(int depth);  }  
 
//叶子节点  public class Leaf implements Component{      private String name;      public Leaf(String n){          this.name = n;      }      public void add(Component c) {          System.out.println("leaf node can't add sub component.");      }      public void display(int depth) {          String sketon = "";          for(int i=0; i<depth; i++){              sketon += "-";          }          System.out.println(sketon + name);      }      public void remove(Component c) {          System.out.println("leaf node can't remove sub component.");      }  }  
 
//枝节点   public class Composite implements Component{      List<Component> children = new ArrayList<Component>();      private String name;      public Composite(String name){          this.name = name;      }            public void add(Component c) {          children.add(c);      }      public void remove(Component c) {          children.remove(c);      }      public void display(int depth) {          String sketon = "";          for(int i=0; i<depth; i++){              sketon += "-";          }          System.out.println(sketon + name);          for(Component c : children){              c.display(depth + 2);          }      }  }  
 
//测试用例 使用组合模式构造windows系统c盘目录结构    public class Test {      public static void main(String[] args){          Component root = new Composite("C:\\");          Component programs = new Composite("Program Files");          programs.add(new Leaf("360杀毒"));          programs.add(new Leaf("Office 2007"));          programs.add(new Leaf("Movie Maker"));          Component windows = new Composite("Windows");          windows.add(new Leaf("system"));          windows.add(new Leaf("system32"));          windows.add(new Leaf("temp"));          Component autoexec = new Leaf("AUTOEXEC.BAT");          Component boot = new Leaf("boot.ini");          root.add(programs);          root.add(windows);          root.add(autoexec);          root.add(boot);          root.display(0);      }  }  
 
以上程序的最后输出:C:\  --Program Files  ----360杀毒  ----Office 2007  ----Movie Maker  --Windows  ----system  ----system32  ----temp  --AUTOEXEC.BAT  --boot.ini  

 适用情景: 当部分和整体呈现层次结构, 并且用户希望在操作上忽略部分和整体的差异时. 也就是说组合模式让客户可以一致的适用组合结构和单个对象.

来源:http://blog.csdn.net/sunxing007/archive/2010/03/28/5425737.aspx

参考:http://blog.csdn.net/fanweiwei/archive/2008/02/26/2121336.aspx