组合模式(Composite Pattern) 是 GoF 23 种设计模式中的结构型模式之一。它的核心思想是:
用统一的方式处理“单个对象”和“对象组合(容器)”,让客户端不需要关心自己操作的是叶子还是树枝。
想象一个公司组织结构:
不管是:
你都希望用同一种方式去调用,而不用写 if (是部门) ... else (是个人)。
组合模式就是用来解决这种**“整体—部分”**关系的。
组合模式中有三类角色:
定义叶子节点和容器节点的公共接口
interface Node {
void operation();
}
最简单对象,没有子节点
class Employee implements Node {
private String name;
public Employee(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("员工 " + name + " 执行工作");
}
}
可以包含其他 Node(叶子或其他容器)
class Department implements Node {
private String name;
private List<Node> children = new ArrayList<>();
public Department(String name) {
this.name = name;
}
public void add(Node node) {
children.add(node);
}
@Override
public void operation() {
System.out.println("部门 " + name + " 开始工作");
for (Node node : children) {
node.operation(); // 递归调用
}
}
}
public class Client {
public static void main(String[] args) {
Node e1 = new Employee("张三");
Node e2 = new Employee("李四");
Department dev = new Department("研发部");
dev.add(e1);
dev.add(e2);
Department company = new Department("公司");
company.add(dev);
company.operation();
}
}
✅ 客户端只依赖 Node 接口
✅ 不需要知道是员工还是部门
Node (抽象)
├── Employee (Leaf)
└── Department (Composite)
├── Employee
└── Department
✅ 树形结构(菜单、文件目录、组织架构)
✅ 希望统一处理个体和整体
✅ 递归结构很明显
java.awt.Componentjava.util.ArrayList(不完全但类似)File 和 Directory)如果你愿意,我也可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。