在 Java 中,组合模式(Composite Pattern) 正是用来**统一处理树形结构(整体–部分关系)**的设计模式。它的核心思想是:让叶子节点和容器节点具有一致的接口,使客户端可以无差别地操作单个对象和对象集合。
下面从「问题 → 模式结构 → Java 示例 → 解决方式」一步步说明。
树形结构常见于:
痛点:
if (是文件夹) ... else (是文件) 判断统一叶子节点和组合节点的接口
定义公共行为(如 operation())
public abstract class Component {
public abstract void operation();
// 可选:子节点管理
public void add(Component c) {
throw new UnsupportedOperationException();
}
public void remove(Component c) {
throw new UnsupportedOperationException();
}
public Component getChild(int i) {
throw new UnsupportedOperationException();
}
}
public class Leaf extends Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("叶子节点:" + name);
}
}
import java.util.ArrayList;
import java.util.List;
public class Composite extends Component {
private String name;
private List<Component> children = new ArrayList<>();
public Composite(String name) {
this.name = name;
}
@Override
public void add(Component c) {
children.add(c);
}
@Override
public void remove(Component c) {
children.remove(c);
}
@Override
public void operation() {
System.out.println("组合节点:" + name);
for (Component c : children) {
c.operation(); // 递归处理
}
}
}
public class Client {
public static void main(String[] args) {
Component file1 = new Leaf("文件A");
Component file2 = new Leaf("文件B");
Composite folder = new Composite("文件夹1");
folder.add(file1);
folder.add(file2);
Composite root = new Composite("根目录");
root.add(folder);
root.operation(); // 统一调用
}
}
✅ 客户端不需要关心是文件还是文件夹
| 问题 | 组合模式的解决方式 |
|---|---|
| 树形结构复杂 | 用递归统一处理 |
| 叶子 / 容器行为不一致 | 抽象成同一接口 |
| 客户端逻辑复杂 | 客户端只调用 operation() |
| 扩展性差 | 新增节点只需实现 Component |
add/removeJava 组合模式通过“统一接口 + 递归调用”,让树形结构中的叶子节点和组合节点可以被一致地处理,从而优雅地解决整体–部分问题。
如果你愿意,我也可以给你一个文件系统实战示例或Spring 中的组合模式应用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。