下面用通俗 + 示例的方式,讲清楚 Java 中组合模式(Composite Pattern)是什么、什么时候用、怎么用。
组合模式:
把“单个对象”和“对象集合”一视同仁,用统一的接口来操作。
一句话记忆:
树形结构 + 统一处理
当你遇到以下情况,就适合用组合模式:
✅ 有 整体-部分 关系
✅ 结构像 树(文件夹 / 菜单 / 组织架构)
✅ 希望 不管是一个还是多个,调用方式一样
常见例子:
定义统一方法(如 operation())
最底层对象,没有子节点
可以包含子节点
public abstract class Organization {
protected String name;
public Organization(String name) {
this.name = name;
}
public abstract void show(int depth);
}
public class Employee extends Organization {
public Employee(String name) {
super(name);
}
@Override
public void show(int depth) {
System.out.println(" ".repeat(depth) + "员工: " + name);
}
}
import java.util.ArrayList;
import java.util.List;
public class Department extends Organization {
private List<Organization> children = new ArrayList<>();
public Department(String name) {
super(name);
}
public void add(Organization org) {
children.add(org);
}
public void remove(Organization org) {
children.remove(org);
}
@Override
public void show(int depth) {
System.out.println(" ".repeat(depth) + "部门: " + name);
for (Organization org : children) {
org.show(depth + 1);
}
}
}
public class Client {
public static void main(String[] args) {
Department root = new Department("总公司");
root.add(new Employee("张三"));
root.add(new Employee("李四"));
Department sub = new Department("研发部");
sub.add(new Employee("王五"));
sub.add(new Employee("赵六"));
root.add(sub);
root.show(0);
}
}
部门: 总公司
员工: 张三
员工: 李四
部门: 研发部
员工: 王五
员工: 赵六
✅ 对“员工”和“部门”使用完全相同的方法
✔ 客户端代码简单
✔ 容易扩展新节点类型
✔ 天然支持递归结构
⚠ 不是所有“包含关系”都适合
⚠ 叶子节点可能被迫实现无意义方法(可用透明/安全模式解决)
组合模式 = 用一棵树,把“个体”和“群体”当成同一种东西来处理
如果你愿意,我也可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。