**组合模式(Composite Pattern)**的核心目标是:让“单个对象”和“对象组合”可以被一致地对待,从而简化客户端代码,提升系统的可扩展性。
当你面对**整体—部分(Part-Whole)**结构时,比如:
问题:
✅ 组合模式解决:
用一个统一的接口,让客户端不关心对象是单个还是组合
if / else 或 instanceof 判断没有组合模式时可能的代码:
if (node instanceof File) {
file.read();
} else if (node instanceof Directory) {
for (Node child : children) {
child.read();
}
}
❌ 问题:
✅ 组合模式后:
node.read();
客户端完全不需要关心内部结构。
组合模式天然适合递归结构:
✅ 操作组合对象时,自动递归到子对象。
把“叶子对象”和“容器对象”当成同一种对象处理
| 角色 | 说明 |
|---|---|
| Component | 抽象组件(统一接口) |
| Leaf | 叶子节点(单个对象) |
| Composite | 组合节点(包含子节点) |
interface Node {
void read();
}
class File implements Node {
public void read() {
System.out.println("读取文件");
}
}
class Directory implements Node {
private List<Node> children = new ArrayList<>();
public void add(Node node) {
children.add(node);
}
public void read() {
for (Node child : children) {
child.read();
}
}
}
Node file1 = new File();
Node file2 = new File();
Directory dir = new Directory();
dir.add(file1);
dir.add(file2);
dir.read(); // 统一调用
✅ 客户端不需要知道 Directory 里有 File
✅ 当满足以下条件时,非常适合组合模式:
add())组合模式解决的是:如何用统一的方式处理“单个对象”和“对象组合”,特别适合树形结构。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。