温馨提示×

温馨提示×

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

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

组合模式结构是怎样的

发布时间:2026-07-24 14:17:26 来源:亿速云 阅读:84 作者:小樊 栏目:编程语言

组合模式(Composite Pattern)是一种结构型设计模式,用于把一组相似对象当作单一对象来处理,常用于表示**“部分-整体”的树形结构**。

下面从结构组成、UML 角色、示例代码三个层面说明。


一、组合模式的结构组成

组合模式的核心思想是:

叶子对象和容器对象实现同一个接口

主要角色

角色 说明
Component(抽象构件) 定义叶子节点和组合节点的共同接口
Leaf(叶子节点) 表示树中的“叶子”,没有子节点
Composite(组合节点) 表示有子节点的容器,可包含 Leaf 或其他 Composite
Client(客户端) 通过 Component 接口操作对象

二、组合模式结构图(简化 UML)

        Component
        /       \
   Leaf      Composite
                |
        children: List<Component>

三、结构详解

1️⃣ Component(抽象构件)

定义统一操作接口,通常包含:

  • 业务方法(如 operation()
  • 可选:添加、删除、获取子节点方法
public interface Component {
    void operation();
}

2️⃣ Leaf(叶子节点)

没有子节点,实现 Component 接口。

public class Leaf implements Component {
    private String name;

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

    @Override
    public void operation() {
        System.out.println("叶子节点:" + name);
    }
}

3️⃣ Composite(组合节点)

包含子节点,可以是 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();
        }
    }
}

4️⃣ Client(客户端)

客户端只依赖 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();
    }
}

四、组合模式的两种实现方式

✅ 1. 透明式(推荐)

  • Component 中声明所有方法(add/remove)
  • Leaf 中这些方法可能空实现或抛异常

✔ 客户端使用统一接口
❌ Leaf 中可能有无意义方法


✅ 2. 安全式

  • 只在 Composite 中定义 add/remove
  • Client 需要区分 Composite 和 Leaf

✔ 更安全
❌ 失去统一性


五、典型应用场景

✅ 树形结构
✅ 希望客户端一致对待单个对象和组合对象

常见例子:

  • 文件系统(文件 / 文件夹)
  • UI 组件(按钮 / 容器)
  • 菜单(菜单项 / 子菜单)
  • 组织架构(员工 / 部门)

六、一句话总结

组合模式 = 统一接口 + 树形结构 + 递归处理

如果你愿意,我也可以:

  • UML 图再画一遍
  • 真实业务案例(如订单、权限树)说明
  • 对比 组合模式 vs 装饰器模式
向AI问一下细节

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

AI