组合模式(Composite Pattern)是一种结构型设计模式,用于把一组相似对象当作单一对象来处理,常用于表示**“部分-整体”的树形结构**。
下面从结构组成、UML 角色、示例代码三个层面说明。
组合模式的核心思想是:
叶子对象和容器对象实现同一个接口
| 角色 | 说明 |
|---|---|
| Component(抽象构件) | 定义叶子节点和组合节点的共同接口 |
| Leaf(叶子节点) | 表示树中的“叶子”,没有子节点 |
| Composite(组合节点) | 表示有子节点的容器,可包含 Leaf 或其他 Composite |
| Client(客户端) | 通过 Component 接口操作对象 |
Component
/ \
Leaf Composite
|
children: List<Component>
定义统一操作接口,通常包含:
operation())public interface Component {
void operation();
}
没有子节点,实现 Component 接口。
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("叶子节点:" + name);
}
}
包含子节点,可以是 Leaf 或 Composite。
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component {
private String name;
private List<Component> children = new ArrayList<>();
public Composite(String name) {
this.name = name;
}
public void add(Component component) {
children.add(component);
}
public void remove(Component component) {
children.remove(component);
}
@Override
public void operation() {
System.out.println("组合节点:" + name);
for (Component child : children) {
child.operation();
}
}
}
客户端只依赖 Component 接口,不关心是叶子还是组合。
public class Client {
public static void main(String[] args) {
Component leaf1 = new Leaf("文件1");
Component leaf2 = new Leaf("文件2");
Composite folder = new Composite("文件夹");
folder.add(leaf1);
folder.add(leaf2);
folder.operation();
}
}
✔ 客户端使用统一接口
❌ Leaf 中可能有无意义方法
✔ 更安全
❌ 失去统一性
✅ 树形结构
✅ 希望客户端一致对待单个对象和组合对象
常见例子:
组合模式 = 统一接口 + 树形结构 + 递归处理
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。