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、相關的設計模式