温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java组合模式是啥概念

发布时间:2026-10-05 08:24:54 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

组合模式(Composite Pattern) 是 GoF 23 种设计模式中的结构型模式之一。它的核心思想是:

用统一的方式处理“单个对象”和“对象组合(容器)”,让客户端不需要关心自己操作的是叶子还是树枝。


一、通俗理解

想象一个公司组织结构:

  • 公司里有「员工(个人)」
  • 也有「部门(里面包含多个员工或其他部门)」

不管是:

  • 给一个人发工资
  • 还是给一个部门发工资(实际是给部门里所有人发)

你都希望用同一种方式去调用,而不用写 if (是部门) ... else (是个人)。

组合模式就是用来解决这种**“整体—部分”**关系的。


二、核心概念

组合模式中有三类角色:

1️⃣ 抽象组件(Component)

定义叶子节点和容器节点的公共接口

interface Node {
    void operation();
}

2️⃣ 叶子节点(Leaf)

最简单对象,没有子节点

class Employee implements Node {
    private String name;

    public Employee(String name) {
        this.name = name;
    }

    @Override
    public void operation() {
        System.out.println("员工 " + name + " 执行工作");
    }
}

3️⃣ 容器节点(Composite)

可以包含其他 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 中的典型例子

  • java.awt.Component
  • java.util.ArrayList(不完全但类似)
  • 文件系统(File 和 Directory)

如果你愿意,我也可以:

  • 用 文件目录例子 讲
  • 画 UML 图
  • 对比 组合模式 vs 装饰器模式

你想看哪一个?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手