組合模式
原理:又叫做部分-整體模式,將對象組合成樹形結構以表示“部分整體”的層次結構
例如:文件系統由目錄和文件組成,目錄可以裝內容,內容可以是目錄或者文件,按照這樣看的話我們的文件系統就是以遞歸的結構來組織的。如果想使用這種數據結構那麼我們就可以使用組合模式
結構:
Component:是組合中對象的聲明接口,實現所有類共有接口的默認行爲 聲明一個接口用於訪問和管理Component
Leaf:在組合中表示葉子結點對象,葉子結點沒有子結點
Composite:定義有枝結點行爲,用來存儲子部件,在Component接口中實現與子部件有關操作:如增加刪除
代碼示例
複製文件的時候我們是複製這個文件夾下面的所有東西,現在我們需要列出分別有什麼目錄,這個時候我們需要用到遞歸,也就是我們可以使用組合模式來實現
Component
//根結點
public interface Node {
public void copy();
}
Leaf
//葉子結點:也就是這個文件下面已經沒有任何文件了
public class File implements Node{
String fileName;
public File(String fileName) {
// TODO Auto-generated constructor stub
this.fileName = fileName;
}
@Override
public void copy() {
// TODO Auto-generated method stub
System.out.println(" "+fileName);
}
}
Composite
import java.awt.List;
import java.util.ArrayList;
//Composite 有枝結點
public class Folder implements Node{
private String folderName;
private ArrayList<Node> lists = new ArrayList<Node>();
public Folder(String folderName) {
// TODO Auto-generated constructor stub
this.folderName = folderName;
}
public void add(Node node){
lists.add(node);
}
@Override
public void copy() {
// TODO Auto-generated method stub
System.out.println(" "+folderName);
for(int i=0;i<lists.size();i++){
Node node = lists.get(i);
node.copy();
}
}
}
測試
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Folder folder = new Folder("學習資料");
Folder folser1 = new Folder("視頻");
Folder folser2= new Folder("學習視頻");
Folder folser3 = new Folder("娛樂視頻");
Folder folser4 = new Folder("音樂");
File file = new File("視頻1");
File file1 = new File("視頻2");
File file2= new File("視頻3");
File file3 = new File("音樂1");
File file4 = new File("音樂2");
folder.add(folser1);
folder.add(folser4);
folser1.add(folser2);
folser1.add(folser3);
folser2.add(file);
folser2.add(file1);
folser3.add(file2);
folser4.add(file3);
folser4.add(file4);
folder.copy();
}
}
運行結果
學習資料
視頻
學習視頻
視頻1
視頻2
娛樂視頻
視頻3
音樂
音樂1
音樂2
結構圖
總結
1.葉子對象和組合對象實現相同的接口。這就是組合模式能將葉子結點和對象結點進行一致處理的原因
2.可以清楚的定義分層次的複雜對象,表示對象的全部或部分層次