1、模式说明java
可以使容器与内容物具备一致性,创造出递归结构的模式就是Composite组合模式。设计模式
举个例子:计算机中的文件系统中有文件和文件夹的概念,咱们知道,文件夹能够包含文件,也能够包含子文件夹,子文件夹中又能够包含文件和文件夹。若是将文件和文件夹都看做“目录条目(Directory Entry)”,那么文件系统就造成了一个递归的容器,这就是一种组合模式。ide
更多例子,在Windows操做系统中,一个窗口中能够包含子窗口,从而造成容器的递归;一条宏命令又能够包含另外一个宏命令;一个文章章节又能够包含多个子章节。。。这种具备树状结构的数据都适用于组合模式。this
2、模式类图spa
3、代码示例操作系统
在示例程序中,咱们建立一个Entry目录条目类,并让File文件类和Dictory文件夹类去继承它。设计
一、FileTreatementException类3d
package com.designpattern.cn.Entry; public class FileTreatementException extends RuntimeException { public FileTreatementException(){ } public FileTreatementException(String msg){ super(msg); } }
二、Entry条目类code
package com.designpattern.cn.Entry; public abstract class Entry { public abstract String getName(); public abstract int getSize(); public Entry add(Entry entry) throws FileTreatementException{ throw new FileTreatementException(); } public void PrintList(){ printList(""); } protected abstract void printList(String prefix); public String toString(){ return getName() + " (" + getSize() + ")"; } }
三、File文件类对象
package com.designpattern.cn.Entry; public class File extends Entry { private String name; private int size; public File(String name, int size){ this.name = name; this.size = size; } public String getName(){ return name; } public int getSize(){ return size; } protected void printList(String prefix){ System.out.println(prefix + "/" + this); } }
四、Directory目录类
package com.designpattern.cn.Entry; import java.util.ArrayList; import java.util.Iterator; public class Directory extends Entry { private String name; private ArrayList directory = new ArrayList(); public Directory(String name){ this.name = name; } public String getName(){ return name; } public int getSize(){ int size = 0; Iterator it = directory.iterator(); while (it.hasNext()){ Entry entry = (Entry) it.next(); size += entry.getSize(); } return size; } public Entry add(Entry entry){ directory.add(entry); return this; } protected void printList(String prefix){ System.out.println(prefix + "/" + this); Iterator it = directory.iterator(); while (it.hasNext()){ Entry entry = (Entry) it.next(); entry.printList(prefix + "/" + name); } } }
五、Main方法类和运行结果
package com.designpattern.cn.Entry; public class Main { public static void main(String[] args) { try { System.out.println("Making root entries..."); Directory rootdir = new Directory("root"); Directory bindir = new Directory("bin"); Directory tmpdir = new Directory("tmp"); Directory usrdir = new Directory("usr"); rootdir.add(bindir); rootdir.add(tmpdir); rootdir.add(usrdir); bindir.add(new File("vi", 10000)); bindir.add(new File("latex", 20000)); rootdir.printList(""); }catch (FileTreatementException e){ e.printStackTrace(); } } }
4、模式中的角色
5、相关的设计模式