在 组合模式(Composite Pattern) 中,Component 和 Composite 是两个核心概念,它们共同实现了一种树形结构的对象组织方式,允许客户端以统一的方式处理单个对象和对象组合。以下是它们的定义和区别:
1. Component(抽象组件)
概念:
Component 是所有对象的抽象基类或接口,定义了所有对象(无论是叶子节点还是组合节点)的通用行为。它声明了管理子组件(添加、删除、获取子组件)的方法,以及执行操作(operation())的方法。
特点:
可以是抽象类或接口。
为所有具体类(叶子节点和组合节点)提供统一的接口。
可以包含默认实现或抛出异常(例如,默认不支持子组件操作)。
2. Composite(组合节点)
概念:
Composite 是 Component 的具体子类,表示可以包含其他子组件(叶子或组合节点)的复杂对象。它通过聚合多个 Component 对象形成树形结构,并实现父类定义的子组件管理方法。
特点:
内部维护一个子组件集合(如列表、数组等)。
实现 Component 定义的接口方法,例如添加、删除、遍历子组件。
可以递归调用子组件的 operation() 方法。
3. 二者的核心区别
特性 Component Composite
角色 抽象接口/基类,定义统一行为 具体类,实现组合逻辑
子组件管理 可能声明子组件管理方法,但默认不实现 具体实现子组件的添加、删除、遍历等逻辑
子组件存储 无 内部维护子组件集合(如列表)
操作行为 可能直接实现具体操作(如叶子节点) 递归调用子组件的操作
是否包含子组件 不直接包含子组件 包含子组件(叶子或组合节点)
4. 示例场景:文件系统
Component:
抽象类 FileSystemItem,定义方法 display()。
Composite:
具体类 Folder,实现 display(),并管理子组件(如文件或其他文件夹)。
例如:调用 folder.display() 会递归显示所有子文件和子文件夹。
Leaf:
具体类 File,实现 display(),但无法包含子组件。
java
Copy Code
// Component 接口
interface FileSystemItem {
void display();
}
// Composite 类
class Folder implements FileSystemItem {
private List<FileSystemItem> items = new ArrayList<>();
public void add(FileSystemItem item) {
items.add(item);
}
@Override
public void display() {
for (FileSystemItem item : items) {
item.display(); // 递归调用子组件的 display()
}
}
}
// Leaf 类
class File implements FileSystemItem {
@Override
public void display() {
System.out.println("显示文件");
}
}
5. 总结
Component 是统一的抽象接口,隐藏了叶子节点和组合节点的差异。
Composite 是具体实现,负责管理子组件并递归调用其行为。
组合模式的核心目的是通过树形结构实现“部分-整体”的层次关系,让客户端无需关心处理的是单个对象还是组合对象。