23种设计模式-结构型模式之组合模式(Java版本)
Java 组合模式(Composite Pattern)详解
🌳 什么是组合模式?
组合模式用于将对象组合成树形结构以表示“部分-整体”的层次结构,使客户端可以统一对待单个对象和组合对象。
🧠 使用场景
- 希望客户端忽略对象组合和单个对象的差别
- 表示树形结构,如图形、文件系统、组织架构等
🏗️ 模式结构
- Component(抽象构件):定义所有对象的共同接口
- Leaf(叶子节点):树的末端节点,无子节点
- Composite(容器构件):有子节点,实现子节点管理逻辑
✅ 示例:文件系统结构
抽象组件(Component)
public abstract class FileComponent {protected String name;public FileComponent(String name) { this.name = name; }public abstract void display(String indent);
}
叶子节点(Leaf)
public class FileLeaf extends FileComponent {public FileLeaf(String name) {super(name);}@Overridepublic void display(String indent) {System.out.println(indent + "📄 " + name);}
}
组合节点(Composite)
import java.util.ArrayList;
import java.util.List;public class FolderComposite extends FileComponent {private List<FileComponent> children = new ArrayList<>();public FolderComposite(String name) {super(name);}public void add(FileComponent component) {children.add(component);}public void remove(FileComponent component) {children.remove(component);}@Overridepublic void display(String indent) {System.out.println(indent + "📁 " + name);for (FileComponent component : children) {component.display(indent + " ");}}
}
客户端调用
public class Client {public static void main(String[] args) {FolderComposite root = new FolderComposite("Root");FolderComposite docs = new FolderComposite("Documents");FolderComposite pics = new FolderComposite("Pictures");FileLeaf file1 = new FileLeaf("Resume.pdf");FileLeaf file2 = new FileLeaf("CoverLetter.docx");FileLeaf img1 = new FileLeaf("Photo.jpg");docs.add(file1);docs.add(file2);pics.add(img1);root.add(docs);root.add(pics);root.display("");}
}
🧩 优点
-
清晰地定义树形结构
-
客户端可以一致性地处理单个对象和组合对象
-
增加新类型节点方便
⚠️ 缺点
-
抽象层与组合层差异被忽略,可能降低类型安全
-
违反开闭原则:添加新功能可能需要修改组件接口
✅ 使用建议
当你需要表示一个树形结构,并希望客户端可以**透明地处理所有节点(不关心是组合还是叶子)**时,组合模式就是你的首选。