設計模式-11-組合模式

組合模式

原理:又叫做部分-整體模式,將對象組合成樹形結構以表示“部分整體”的層次結構
例如:文件系統由目錄和文件組成,目錄可以裝內容,內容可以是目錄或者文件,按照這樣看的話我們的文件系統就是以遞歸的結構來組織的。如果想使用這種數據結構那麼我們就可以使用組合模式

結構:
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.可以清楚的定義分層次的複雜對象,表示對象的全部或部分層次




發佈了69 篇原創文章 · 獲贊 72 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章