组合模式(Composite Pattern) 是 Java 中常用的结构型设计模式,核心思想是:
把“单个对象”和“对象组合”当成同一种类型来处理。
非常适合树形结构场景,比如:菜单、目录、组织架构、UI 组件。
问题:
客户端不想区分“单个对象”和“组合对象”,统一调用。
解决:
| 角色 | 说明 |
|---|---|
| Component | 抽象组件(接口或抽象类) |
| Leaf | 叶子节点 |
| Composite | 容器节点(可包含子节点) |
| Client | 使用方 |
public interface FileComponent {
void show();
}
public class File implements FileComponent {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void show() {
System.out.println("文件:" + name);
}
}
import java.util.ArrayList;
import java.util.List;
public class Directory implements FileComponent {
private String name;
private List<FileComponent> children = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
public void add(FileComponent component) {
children.add(component);
}
public void remove(FileComponent component) {
children.remove(component);
}
@Override
public void show() {
System.out.println("目录:" + name);
for (FileComponent child : children) {
child.show();
}
}
}
public class Client {
public static void main(String[] args) {
FileComponent file1 = new File("a.txt");
FileComponent file2 = new File("b.txt");
Directory dir1 = new Directory("文档");
dir1.add(file1);
dir1.add(file2);
Directory root = new Directory("根目录");
root.add(dir1);
root.add(new File("readme.txt"));
root.show();
}
}
目录:根目录
目录:文档
文件:a.txt
文件:b.txt
文件:readme.txt
public interface Component {
void operation();
void add(Component c);
void remove(Component c);
}
⚠️ 叶子节点可能抛异常
Composite c = (Composite) component;
c.add(...);
✅ 树形结构
✅ 希望客户端统一处理单个对象和组合对象
✅ 需要递归操作(如遍历、统计)
典型应用:
组合模式 = 树形结构 + 统一接口 + 递归处理
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。