1、前言java
關於Composite組合模式,這個模式在咱們的生活中也常常使用,好比說若是讀者有使用java的GUI編寫過程序的,確定少不了定義一些組件,初始化以後,使用容器的add方法,將這些組件有順序的組織成一個界面出來;或者讀者若是編寫過前臺的頁面,確定使用過<div>等標籤訂義一些格式,而後格式之間互相組合,經過一種遞歸的方式組織成相應的結果,這種方式其實就是組合,將部分的組件鑲嵌到總體之中;又或者文件和文件夾的組織關係,經過目錄表項做爲共同的特質(父類),一個文件夾能夠包含多個文件夾和多個文件,一個文件容納在一個文件夾中。那麼憑什麼能夠這樣作呢,須要知足一下兩點:設計模式
這個父類使得組件中的共同的本質能夠提取出來,進行互融,其實就是父類只用add方法,這樣子類就能夠經過抽象的方式經過父類來表達了。學習
2、代碼this
Entry抽象類:共同特質spa
package zyr.dp.composite; public abstract class Entry { public abstract String getName(); public abstract int getSize(); public abstract void printList(String prefix); public void printList(){ printList(""); } public Entry add(Entry entry) throws RuntimeException{ throw new RuntimeException(); } public String toString(){ return getName()+"<"+getSize()+">"; } }
File類:實現類,葉子結點.net
package zyr.dp.composite; 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; } public void printList(String prefix) { System.out.println(prefix+"/"+this); } }
Directory類:可擴充節點(中間節點)設計
package zyr.dp.composite; import java.util.ArrayList; import java.util.Iterator; public class Directory extends Entry { String name; ArrayList entrys=new ArrayList(); public Directory(String name){ this.name=name; } public String getName() { return name; } public int getSize() { int size=0; Iterator it=entrys.iterator(); while(it.hasNext()){ size+=((Entry)it.next()).getSize(); } return size; } public Entry add(Entry entry) { entrys.add(entry); return this; } public void printList(String prefix) { System.out.println(prefix+"/"+this); Iterator it=entrys.iterator(); Entry entry; while(it.hasNext()){ entry=(Entry)it.next(); entry.printList(prefix+"/"+name); } } }
Main類:組合組件3d
package zyr.dp.composite; public class Main { public static void main(String[] args) { Directory root=new Directory("根目錄"); Directory life=new Directory("個人生活"); File eat=new File("吃火鍋",100); File sleep=new File("睡覺",100); File study=new File("學習",100); life.add(eat); life.add(sleep); life.add(study); Directory work=new Directory("個人工做"); File write=new File("寫博客",200); File paper=new File("寫論文",200); File homework=new File("寫家庭做業",200); work.add(write); work.add(paper); work.add(homework); Directory relax=new Directory("個人休閒"); File music=new File("聽聽音樂",200); File walk=new File("出去轉轉",200); relax.add(music); relax.add(walk); Directory read=new Directory("個人閱讀"); File book=new File("學習書籍",200); File novel=new File("娛樂小說",200); read.add(book); read.add(novel); root.add(life); root.add(work); root.add(relax); root.add(read); root.printList("D:"); System.out.println("================="); work.printList("work"); System.out.println("================="); novel.printList("novel"); } }
運行結果:code
3、總結blog
因而可知,咱們之前使用的「容器+內容」,實際上是經過組合模式實現的,組合模式保證了容器和內容的一致性,容器裏面能夠嵌套容器,也能夠放內容,可是內容已是葉子結點了,不能繼續擴充,還記得咱們在抽象工廠模式中,爲了將零件組裝成產品,咱們就使用了組合模式,很是的有意思,經過遞歸來遍歷全部的內容。組合模式在咱們的生活中使用的很是廣泛,咱們必定要使用好這個模式,理解其中的抽象,特別是add()的定義,抽象類和實現類之間的參數傳遞,這點相當重要,固然咱們又使用了模板方法和迭代器,但願你們能明白模式之間的聯繫以及相互使用的道理。