组合模式(Composite Pattern)实现递归的核心思想是:
让“单个对象”和“组合对象”实现同一个接口,组合对象内部再持有多个该接口的子对象,从而形成一个递归结构。
下面我从 思想 → 结构 → 代码示例 → 递归调用过程 四个方面说明。
组合模式的目标是:
把“部分-整体”关系用树形结构表示,并让客户端以一致的方式处理单个对象和组合对象。
关键点在于:
这正是递归的本质。
Component(抽象组件)
├── Leaf(叶子节点)
└── Composite(组合节点)
Component
operation()、print())Leaf(叶子)
Composite(组合)
Componentpublic interface FileComponent {
void print();
}
public class File implements FileComponent {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println("文件:" + name);
}
}
import java.util.ArrayList;
import java.util.List;
public class Folder implements FileComponent {
private String name;
private List<FileComponent> children = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
public void add(FileComponent component) {
children.add(component);
}
@Override
public void print() {
System.out.println("文件夹:" + name);
// ✅ 递归调用
for (FileComponent child : children) {
child.print();
}
}
}
public class Client {
public static void main(String[] args) {
File f1 = new File("a.txt");
File f2 = new File("b.txt");
Folder subFolder = new Folder("子文件夹");
subFolder.add(f1);
Folder root = new Folder("根文件夹");
root.add(subFolder);
root.add(f2);
root.print();
}
}
调用过程如下:
root.print()
└── 文件夹:根文件夹
├── subFolder.print()
│ └── 文件夹:子文件夹
│ └── a.txt
└── b.txt
✅ 递归的本质:
Folder.print() 调用了 child.print()child 可能是 Folder,也可能是 FileFolder,就会继续向下递归✅ 接口统一
叶子节点和组合节点实现同一个接口
✅ 组合节点持有自身类型的集合
List<FileComponent> children;
✅ 组合节点在方法中递归调用子节点方法
✅ 递归终止条件由叶子节点隐式提供
叶子节点不再继续调用子节点
❌ 认为只有“递归函数”才算递归
✅ 对象结构 + 方法调用链 也是递归
❌ 让叶子节点也维护子节点
✅ 只有 Composite 才维护子节点
组合模式通过“统一接口 + 树形结构 + 组合对象递归调用子对象”,天然实现了递归。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。