小兔网

组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。很明显,这是树形结构,终结点叫叶子节点,非终节点(组节点)叫树枝节点,第一个节点叫根节点。同时也类似于文件目录的结构形式:文件可称之为终节点,目录可称之为非终节点(组节点)。

普通实现

1、我们首先来看一个目录结构的普通实现:

目录节点:Noder

import java.util.ArrayList;import java.util.List;/** * 目录节点 * 包含: * 1、目录名 * 2、下级文件列表 * 3、下级目录列表 * 4、新增文件方法 * 5、新增目录方法 * 6、显示下级内容方法 */public class Noder { String nodeName;//目录名 //通过构造器为目录命名 public Noder(String nodeName){ this.nodeName = nodeName; } List<Noder> nodeList = new ArrayList<Noder>();//目录的下级目录列表 List<Filer> fileList = new ArrayList<Filer>();//目录的下级文件列表 //新增下级目录 public void addNoder(Noder noder){ nodeList.add(noder); } //新增文件 public void addFiler(Filer filer){ fileList.add(filer); } //显示下级目录及文件 public void display(){ for(Noder noder:nodeList){ System.out.println(noder.nodeName); noder.display();//递归显示目录列表 } for(Filer filer:fileList){ filer.display(); } }}

文件节点:Filer

/** * 文件节点 * 文件节点是终节点,无下级节点 * 包含: * 1、文件名 * 2、文件显示方法 */public class Filer { String fileName;//文件名 public Filer(String fileName){ this.fileName = fileName; } //文件显示方法 public void display(){ System.out.println(fileName); }}

测试类:Clienter

import java.io.File; public class Clienter { public static void createTree(Noder node){ File file = new File(node.nodeName); File[] f = file.listFiles(); for(File fi : f){ if(fi.isFile()){ Filer filer = new Filer(fi.getAbsolutePath()); node.addFiler(filer); } if(fi.isDirectory()){ Noder noder = new Noder(fi.getAbsolutePath()); node.addNoder(noder); createTree(noder);//使用递归生成树结构 } } } public static void main(String[] args) { Noder noder = new Noder("E://ceshi"); createTree(noder);//创建目录树形结构 noder.display();//显示目录及文件 }}