1. Composite模式概述
Composite模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示"部分-整体"的层次结构。这种模式使得客户端可以统一地处理单个对象和组合对象,无需关心它们之间的差异。
在软件开发中,我们经常会遇到需要处理树形结构的场景。比如文件系统中的文件和文件夹、图形界面中的控件和容器、组织结构中的部门和员工等。Composite模式为这类问题提供了一种优雅的解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Composite模式的核心结构
2.1 模式参与者
Composite模式通常包含以下几个关键角色:
-
Component(抽象组件):
- 定义组合中所有对象的通用接口
- 声明访问和管理子组件的方法
- 可选地提供默认实现
-
Leaf(叶子组件):
- 表示组合中的叶子节点对象
- 实现Component接口
- 没有子组件
-
Composite(复合组件):
- 定义有子组件的组件行为
- 存储子组件
- 在Component接口中实现与子组件相关的操作
2.2 UML类图
code复制[Component]
|__[Leaf]
|__[Composite]
|__children: List<Component>
3. Composite模式实现示例
3.1 基础实现
让我们通过一个文件系统的例子来演示Composite模式的实现:
java复制// 抽象组件
interface FileSystemComponent {
void display(int indent);
}
// 叶子组件 - 文件
class File implements FileSystemComponent {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void display(int indent) {
System.out.println(" ".repeat(indent) + "- " + name);
}
}
// 复合组件 - 文件夹
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);
}
@Override
public void display(int indent) {
System.out.println(" ".repeat(indent) + "+ " + name);
for (FileSystemComponent child : children) {
child.display(indent + 2);
}
}
}
3.2 客户端使用示例
java复制public class Client {
public static void main(String[] args) {
Directory root = new Directory("Root");
Directory documents = new Directory("Documents");
documents.add(new File("resume.pdf"));
documents.add(new File("notes.txt"));
Directory pictures = new Directory("Pictures");
pictur
