组合模式
字数: 0 字 时长: 0 分钟
简介
组合模式(Composite Pattern)的核心是:将对象组合成树形结构,使得用户对单个对象和组合对象的使用具有一致性,它通过递归组合实现树状结构的统一操作。
比如一个文件夹里既可以放文件夹也可以放文件,组合模式使得用户对文件和文件夹的使用具有一致性,不需要判断是文件还是文件夹。
UML 类图
- 抽象组件(Component):定义了所有组件必须遵循的接口
- 叶子节点(Leaf):代表最基本的、不能再分的对象,不会再包含子节点
- 容器节点(Composite):代表可以包含子节点的对象
实现示例
java
// 1. 定义抽象组件
interface FileComponent {
// 定义展示目录结构的方法
void display(String ident);
}
// 2. 实现叶子节点类
class FileLeaf implements FileComponent {
private String name;
public FileLeaf(String name) {
this.name = name;
}
@Override
public void display(String ident) {
// 叶子节点只能为文件,负责输出字节的名字即可
System.out.println(ident + "-文件:" + name);
}
}
// 3. 实现组合节点类
class FolderComposite implements FileComponent {
private String name;
private List<FileComponent> children = new ArrayList<>();
public FolderComposite(String name) {
this.name = name;
}
public void add(FileComponent component) {
children.add(component);
}
public void remove(FileComponent component) {
children.remove(component);
}
@Override
public void display(String ident) {
System.out.println(ident + "-文件夹:" + name);
for (FileComponent component : children) {
component.display(ident + " ");
}
}
}
// 4. 调用示例:构建并展示一个文件树结构
public static void main(String[] args) {
// 创建文件
FileLeaf file1 = new FileLeaf("readme.txt");
FileLeaf file2 = new FileLeaf("file2.txt");
FileLeaf file3 = new FileLeaf("file3.txt");
// 创建文件夹
FileComposite root = new FileComposite("根目录");
FileComposite docs = new FileComposite("文档");
// 构建层级关系
root.add(docs);
root.add(file1);
docs.add(file2);
docs.add(file3);
// 显示结构
root.display("");
}