Java模式 - Composite(组合模式)

 http://blog.csdn.net/ai92/article/details/298336

 

 

 

[http://www.impeng.org/composite.html]

Java与设计模式-组合模式

组合模式(Composite)属于结构性模式,它描述了对象间的组合关系。

对象间常常通过树结构来组织(包含)起来,以实现整体-部分的层次结构。整体上可以看做是一个组合对象

抛却各种复杂的术语,组合模式的特点是:

对象通过实现(继承)统一的接口(抽象类),调用者对单一对象和组合对象的操作具有一致性。

组合模式很常见,Java的容器类(比如ArrayList)都实现了组合模式。

我们平常操作最多的文件(夹)就是组合模式的最好例子。文件系统是树形层次结构,并且文件和文件夹提供给用户的一些操作是相同的,比如复制。于是,可以通过一个统一的接口将文件和文件夹统一起来,对用户提供一致的操作,屏蔽不同的复制实现过程。我们在复制文件夹的时候,操作系统实现了对文件夹内的所有文件和文件夹的复制,即实现了组合对象的整体复制,而不是一个空的文件夹;这和我们复制单个文件的体验是一致的。这便是组合模式的妙处。

完整的模拟代码如下:

  1. package com.csufox.Composite;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. interface Node{  
  6.     public void copy(); //定义统一的接口:复制  
  7. }  
  8.  
  9. class Folder implements Node{  
  10.     private String folderName;  
  11.     private ArrayList nodeList =new ArrayList(); //用于存储文件夹下的文件夹或文件的信息 
  12.  
  13.     public Folder(String folderName){  
  14.         this.folderName = folderName;  
  15.     }  
  16.  
  17.     public void add(Node node){ //增加文件或文件夹  
  18.         nodeList.add(node);  
  19.     }  
  20.  
  21.     public void copy(){  //文件夹复制操作实现递归  
  22.         System.out.println("复制文件夹:" + folderName);  
  23.         for(int i=0;i
  24.             Node node = (Node)nodeList.get(i);  
  25.             node.copy();  
  26.         }  
  27.     }  
  28. }  
  29.  
  30. class File implements Node{  
  31.     private String fileName;  
  32.  
  33.     public File(String fileName){  
  34.         this.fileName = fileName;  
  35.     }  
  36.  
  37.     public void copy(){  
  38.         System.out.println("复制文件:" + fileName);  
  39.     }  
  40. }  
  41.  
  42. public class Composite{  
  43.     public static void main(String[] args){  
  44.         Folder document = new Folder("我的资料"); //我的资料文件夹  
  45.         File book = new File("Java编程思想.pdf");  //文档文件  
  46.         Folder music = new Folder("我的音乐");   //我的音乐文件夹  
  47.         File music1 = new File("你是我的眼.mp3");   //音乐文件1  
  48.         File music2 = new File("Without You.mp3");  //音乐文件2  
  49.         //确定树形结构关系  
  50.         document.add(book);  
  51.         document.add(music);  
  52.         music.add(music1);  
  53.         music.add(music2);  
  54.  
  55.         document.copy(); //复制“我的资料”文件夹,递归地复制了其下所有文件夹和文件。 
  56.     }  

运行结果如下:

  1. 复制文件夹:我的资料  
  2. 复制文件:Java编程思想.pdf  
  3. 复制文件夹:我的音乐  
  4. 复制文件:你是我的眼.mp3  
  5. 复制文件:Without You.mp3 

由以上的代码和运行结果可知:

通过实现组合模式,用户对文件夹的操作与对普通文件的操作并无差异。用户完全不用关心这是文件夹还是文件,也不用关心文件夹内部的具体结构,就可以完成相关操作。

同样的道理,我们可以表达如下:

通过实现组合模式,调用者对组合对象的操作与对单一对象的操作具有一致性。调用者不用关心这是组合对象还是文件,也不用关心组合对象内部的具体结构,就可以调用相关方法,实现功能。

仔细分析copy()方法的代码,我们会发现,如果从面向过程的角度思考,组合模式通过递归原理实现了树结构(组合对象)的深度优先遍历。

你可能感兴趣的:(Java设计模式)