温馨提示×

温馨提示×

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

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

组合模式在java怎么用

发布时间:2026-09-14 15:14:49 来源:亿速云 阅读:84 作者:小樊 栏目:编程语言

组合模式(Composite Pattern) 是一种结构型设计模式,常用于树形结构场景,比如菜单、文件系统、组织架构等。它的核心思想是:让单个对象和组合对象(容器)具有一致的行为接口

下面用 Java 示例 一步一步说明怎么用。


一、适用场景

  • 整体与部分关系(如:文件夹 + 文件)
  • 希望客户端统一处理单个对象和组合对象
  • 树形结构(递归结构)

二、组合模式结构

1️⃣ 抽象组件(Component)

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

public abstract class Component {
    protected String name;

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

    public abstract void operation();

    // 可选方法(默认实现,子类可重写)
    public void add(Component c) {
        throw new UnsupportedOperationException();
    }

    public void remove(Component c) {
        throw new UnsupportedOperationException();
    }
}

2️⃣ 叶子节点(Leaf)

不能再包含子节点

public class Leaf extends Component {

    public Leaf(String name) {
        super(name);
    }

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

3️⃣ 组合节点(Composite)

可以包含子节点

import java.util.ArrayList;
import java.util.List;

public class Composite extends Component {

    private List<Component> children = new ArrayList<>();

    public Composite(String name) {
        super(name);
    }

    @Override
    public void add(Component c) {
        children.add(c);
    }

    @Override
    public void remove(Component c) {
        children.remove(c);
    }

    @Override
    public void operation() {
        System.out.println("组合节点: " + name);
        for (Component c : children) {
            c.operation();
        }
    }
}

三、客户端使用示例

public class Client {
    public static void main(String[] args) {

        Composite root = new Composite("根节点");

        Composite branch = new Composite("分支节点");
        Leaf leaf1 = new Leaf("叶子1");
        Leaf leaf2 = new Leaf("叶子2");

        branch.add(leaf1);
        branch.add(leaf2);

        root.add(branch);
        root.add(new Leaf("叶子3"));

        root.operation();
    }
}

输出结果

组合节点: 根节点
组合节点: 分支节点
叶子节点: 叶子1
叶子节点: 叶子2
叶子节点: 叶子3

四、透明式 vs 安全式(重点)

✅ 透明式(上面示例)

  • 叶子也有 add/remove
  • 客户端使用简单
  • 但叶子调用 add 会抛异常

✅ 安全式

  • add/remove 只在 Composite 中定义
  • 更安全,但客户端需要判断类型

五、真实应用例子

  • Swing / JavaFX 控件树
  • 文件目录系统
  • 公司组织架构
  • 权限菜单

六、一句话总结

组合模式让“单个对象”和“对象集合”用同一套接口处理,适合树形结构。

如果你愿意,我也可以帮你写一个 实际项目中的组合模式例子(如菜单权限)

向AI问一下细节

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

AI