合并模式:把部分和整体的关系用树结构表示出来。
- 一个文件系统就是一个合成模式系统
- 树上有节点:树枝,树叶
- 树枝:目录
- 树叶:文件
- 下面是组合模式的类图:
- 下面是简单代码实现:
测试类:import java.util.*; abstract class AbstractFile { protected String name;//目录或文件名 public AbstractFile() { } public AbstractFile(String name) { this.name = name; } } class File extends AbstractFile{ public File() { } public File(String name) { super(name); } } class Folder extends AbstractFile{ private List<AbstractFile> list= new ArrayList<AbstractFile>(); public Folder() { } public Folder(String name) { super(name); } public void add(AbstractFile t) { list.add(t); } public void out(Folder af) { int len = af.list.size(); for(int i=0; i<len; ++i) { System.out.println(af.list.get(i).name); if(af.list.get(i) instanceof Folder) {//如果是目录 Folder f = (Folder)af.list.get(i); f.out(f); //递归实现输出文件或目录名称 } } } }
输出结果:public class TestAbstractFile { public static void main(String[] args) { Folder f = new Folder("F:\\"); File file1 = new File("1.a");//文件 File file2 = new File("1.b"); Folder f1 = new Folder("\\aa");//目录 File file3 = new File("2.a"); File file4 = new File("2.b"); Folder f2 = new Folder("\\bb"); File file5 = new File("3.a"); File file6 = new File("3.b"); //组合 f.add(file1); f.add(file2); f.add(f1); f1.add(file3); f1.add(file4); f1.add(f2); f2.add(file5); f2.add(file6); //输出所有文件的name,包括目录名 f.out(f); } }
1.b
\aa
2.a
2.b
\bb
3.a
3.b