温馨提示×

温馨提示×

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

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

java组合模式怎么写

发布时间:2026-10-05 09:38:57 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,组合模式(Composite Pattern)常用于树形结构,比如菜单、文件夹、组织架构等。核心思想是:把“单个对象”和“组合对象”一视同仁。

下面我用 “菜单 + 子菜单” 的例子给你写一个完整、易懂的 Java 组合模式示例。


一、组合模式结构说明

组合模式通常包含三部分:

  1. Component(抽象组件)
    • 定义统一接口
  2. Leaf(叶子节点)
    • 没有子节点
  3. Composite(容器节点)
    • 可以包含子节点

二、示例代码(菜单系统)

1️⃣ 抽象组件(Component)

// 菜单组件
public abstract class MenuComponent {

    public void add(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }

    public void remove(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }

    public MenuComponent getChild(int i) {
        throw new UnsupportedOperationException();
    }

    public String getName() {
        throw new UnsupportedOperationException();
    }

    public void print() {
        throw new UnsupportedOperationException();
    }
}

2️⃣ 叶子节点(Leaf:菜单项)

// 菜单项(叶子)
public class MenuItem extends MenuComponent {

    private String name;

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

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void print() {
        System.out.println("菜单项:" + name);
    }
}

3️⃣ 组合节点(Composite:菜单)

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

// 菜单(可包含子菜单或菜单项)
public class Menu extends MenuComponent {

    private String name;
    private List<MenuComponent> menuComponents = new ArrayList<>();

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

    @Override
    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

    @Override
    public void remove(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }

    @Override
    public MenuComponent getChild(int i) {
        return menuComponents.get(i);
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void print() {
        System.out.println("菜单:" + name);
        for (MenuComponent component : menuComponents) {
            component.print();
        }
    }
}

4️⃣ 测试类

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

        MenuComponent coffeeMenu = new Menu("咖啡菜单");
        coffeeMenu.add(new MenuItem("美式咖啡"));
        coffeeMenu.add(new MenuItem("拿铁"));

        MenuComponent dessertMenu = new Menu("甜点菜单");
        dessertMenu.add(new MenuItem("蛋糕"));
        dessertMenu.add(new MenuItem("冰淇淋"));

        MenuComponent allMenu = new Menu("总菜单");
        allMenu.add(coffeeMenu);
        allMenu.add(dessertMenu);

        allMenu.print();
    }
}

三、输出结果

菜单:总菜单
菜单:咖啡菜单
菜单项:美式咖啡
菜单项:拿铁
菜单:甜点菜单
菜单项:蛋糕
菜单项:冰淇淋

四、组合模式核心优点

✅ 客户端无需区分“单个对象”和“组合对象”
✅ 符合 开闭原则
✅ 非常适合 树形结构


五、适用场景

  • 文件系统(文件夹 + 文件)
  • 菜单系统
  • UI 组件树
  • 公司组织结构

如果你愿意,我也可以:

  • 用 更简单的例子(如文件夹)
  • 写成 接口方式
  • 讲 透明式 vs 安全式组合模式
  • 结合 Spring / 实际项目

你想看哪一种?

向AI问一下细节

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

AI
助
手