使用頻率:★★★★☆
一、什麼是組合模式
樹形結構的實作,用于描述“整體-部分”的關系;
二、補充說明
使用場景:部分/整體場景,如樹形菜單; 檔案/檔案夾; 樹形結構的公司層級關系...
三、角色
抽象角色
葉子角色
樹枝角色
用戶端角色
四、例子,JAVA實作
利用組合模式實作如下檔案/檔案夾的樹形結構關系;

抽象角色,抽象檔案: 具體檔案和具體檔案夾都繼承該抽象檔案角色
package com.pichen.dp.structuralpattern.combination;
public abstract class File {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void showFileName();
}
樹枝角色:具體檔案夾
package com.pichen.dp.structuralpattern.combination;
import java.util.ArrayList;
import java.util.List;
public class Folder extends File{
private List<File> fileList = new ArrayList<File>();
public Folder(String name) {
this.name = name;
}
@Override
public void showFileName() {
System.out.println(this.name);
}
public void addFile(File file){
fileList.add(file);
}
//列印檔案夾下的檔案名
public void displayFiles(){
for(File file : this.fileList){
file.showFileName();
}
}
}
葉子角色:具體檔案
package com.pichen.dp.structuralpattern.combination;
public class TXTFile extends File{
public TXTFile(String name) {
this.name = name;
}
@Override
public void showFileName() {
System.out.println(this.name);
}
}
package com.pichen.dp.structuralpattern.combination;
public class AVIFile extends File{
public AVIFile(String name) {
this.name = name;
}
@Override
public void showFileName() {
System.out.println(this.name);
}
}
用戶端,模拟檔案/檔案夾樹形結構
package com.pichen.dp.structuralpattern.combination;
public class Main {
public static void main(String[] args) {
Folder folder = new Folder("一級目錄");
File txtFile = new TXTFile("二級檔案txt");
File aviFile = new AVIFile("二級檔案avi");
Folder txtFolder = new Folder("二級txt目錄");
Folder aviFolder = new Folder("二級avi目錄");
File txtFile1 = new TXTFile("三級檔案txt1");
File txtFile2 = new TXTFile("三級檔案txt2");
File txtFile3 = new TXTFile("三級檔案txt3");
File aviFile1 = new AVIFile("三級檔案avi1");
File aviFile2 = new AVIFile("三級檔案avi2");
folder.addFile(txtFile);
folder.addFile(aviFile);
folder.addFile(txtFolder);
folder.addFile(aviFolder);
txtFolder.addFile(txtFile1);
txtFolder.addFile(txtFile2);
txtFolder.addFile(txtFile3);
aviFolder.addFile(aviFile1);
aviFolder.addFile(aviFile2);
System.out.println("一級目錄下的檔案:");
folder.displayFiles();
System.out.println("\n二級txt目錄下的檔案:");
txtFolder.displayFiles();
System.out.println("\n二級avi目錄目錄下的檔案:");
aviFolder.displayFiles();
}
}
列印結果:
一級目錄下的檔案:
二級檔案txt
二級檔案avi
二級txt目錄
二級avi目錄
二級txt目錄下的檔案:
三級檔案txt1
三級檔案txt2
三級檔案txt3
二級avi目錄目錄下的檔案:
三級檔案avi1
三級檔案avi2
@Author 風一樣的碼農
@HomePageUrl http://www.cnblogs.com/chenpi/
@Copyright 轉載請注明出處,謝謝~