軟件設計模式(Design pattern),又稱設計模式,是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。
匯總目錄鏈接:【玩轉23種Java設計模式】學習目錄匯總整理
文章目錄
- 一、簡介
- 二、實例
- 1、抽象組件
- 2、葉子節點:文件
- 3、組合節點:文件夾
- 4、客戶端使用
- 三、總結
- 1、優點
- 2、缺點
- 3、應用場景
一、簡介
??組合模式(Composite Pattern)是一種結構型設計模式,用于將對象組合成樹形結構以表示"部分-整體"的層次關系。其核心思想是通過統一接口處理葉子對象(單個元素)和組合對象(容器元素),使客戶端無需區分操作的是單個對象還是整個組合結構。
核心角色:
- Component:聲明組合對象的通用接口
- Leaf:葉子節點(無子節點)
- Composite:容器節點(包含子組件集合)
二、實例
假設需要構建文件系統,包含文件夾(組合對象)和文件(葉子對象)。
1、抽象組件
interface FileSystemComponent {void display(int indent);long getSize();
}
2、葉子節點:文件
class File implements FileSystemComponent {private String name;private long size;public File(String name, long size) {this.name = name;this.size = size;}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📄 " + name + " (" + size + "KB)");}@Overridepublic long getSize() { return size; }
}
3、組合節點:文件夾
class Directory implements FileSystemComponent {private String name;private List<FileSystemComponent> children = new ArrayList<>();public Directory(String name) {this.name = name;}public void add(FileSystemComponent component) {children.add(component);}@Overridepublic void display(int indent) {System.out.println(" ".repeat(indent) + "📁 " + name);children.forEach(child -> child.display(indent + 2));}@Overridepublic long getSize() {return children.stream().mapToLong(FileSystemComponent::getSize).sum();}
}
4、客戶端使用
public class Demo {public static void main(String[] args) {Directory root = new Directory("Root");Directory documents = new Directory("Documents");documents.add(new File("resume.pdf", 256));documents.add(new File("notes.txt", 128));Directory images = new Directory("Images");images.add(new File("photo1.jpg", 2048));root.add(documents);root.add(images);root.display(0);System.out.println("Total size: " + root.getSize() + "KB");}
}
輸出示例:
📁 Root
📁 Documents
📄 resume.pdf (256KB)
📄 notes.txt (128KB)
📁 Images
📄 photo1.jpg (2048KB)
Total size: 2432KB
三、總結
1、優點
- 簡化客戶端代碼:統一處理單個對象與組合結構。
- 高擴展性:新增組件類型無需修改現有代碼。
- 天然支持遞歸結構:方便實現樹形操作(如遍歷、統計)。
2、缺點
- 類型安全性問題:需要運行時類型檢查。
- 接口設計難度:需兼顧葉子與容器的不同需求。
- 可能違反接口隔離原則:需要為不需要的方法提供空實現。
3、應用場景
- GUI組件庫(窗口包含面板/按鈕等)。
- 組織架構管理系統(部門包含員工/子部門)。
- 數學表達式解析(操作符包含子表達式)。
- 游戲場景圖(父節點包含子節點)。
- XML/JSON文檔處理。
??當系統需要處理樹形結構,且希望以統一方式操作層次中的不同元素時,組合模式是最佳選擇。其價值在于模糊了簡單元素與復雜元素的邊界,讓復雜的層次結構變得易于管理和擴展。