Java设计模式—组合模式(Composite Pattern)

组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

java 复制代码
public class CompositeTest {
    public static void main(String[] args){
        // 创建主菜单
        MenuComponent mainMenu = new Menu("Insert");
        // 创建子菜单
        MenuComponent subMenu = new Menu("Chart");
        // 创建菜单项
        MenuComponent element = new MenuItem("On This Sheet");
        
        // 将子菜单添加到主菜单中
        mainMenu.addMenuElement(subMenu);
        // 将菜单项添加到子菜单中
        subMenu.addMenuElement(element);
        
        // 打印菜单结构
        printMenus(mainMenu);
    }
    
    private static void printMenus(MenuComponent ifile){
        // 打印当前菜单的名称
        ifile.printName();
        // 获取当前菜单的子元素列表
        List<MenuComponent> children = ifile.getElement();

        // 如果子元素列表为空,则直接返回
        if(children == null) return;
        
        // 遍历子元素列表,递归打印每个子元素的名称
        for(MenuComponent element : children){
            printMenus(element);
        }
    }
}
java 复制代码
public class Menu extends MenuComponent{
    private List<MenuComponent> elementList;

    public Menu(String name){
        this.name = name;
        this.elementList = new ArrayList<>();
    }

    public boolean addMenuElement(MenuComponent element){
        return elementList.add(element);
    }

    public boolean removeMenuElement(MenuComponent element){
        return elementList.remove(element);
    }

    public List<MenuComponent> getElement(){
        return elementList;
    }
}
java 复制代码
public class MenuItem extends MenuComponent{
    public MenuItem(String name){
        this.name = name;
    }

    public boolean addMenuElement(MenuComponent element){
        return false;
    }

    public boolean removeMenuElement(MenuComponent element){
        return false;
    }

    public List<MenuComponent> getElement(){
        return null;
    }
}
java 复制代码
public abstract class MenuComponent {
    protected String name;

    public void printName(){
        System.out.println(name);
    }

    public abstract boolean addMenuElement(MenuComponent element);

    public abstract List<MenuComponent> getElement();
}

MenuComponent 抽象类:定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。

Menu 类:表示菜单,可以包含其他菜单或菜单项。

MenuItem 类:表示菜单中的一个具体项。

CompositeTest 类:包含了 main 方法,用于测试组合模式的实现。

CompositeTest 类中,main 方法创建了一个主菜单、一个子菜单以及一个菜单项,并将它们按照一定的结构添加到了一起。然后调用 printMenus 方法打印整个菜单的结构。

Menu 类表示菜单,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。Menu 类中包含一个 elementList 成员变量,用于存储菜单中的子元素(即菜单或菜单项)。它提供了添加和移除子元素的方法,并实现了抽象方法 getElement 来获取子元素列表。

MenuComponent 抽象类定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。它有一个 name 成员变量表示菜单组件的名称,并定义了一个抽象方法 addMenuElement 用于添加子元素,以及一个抽象方法 getElement 用于获取子元素列表。

MenuItem 类表示菜单中的一个具体项,它继承自 MenuComponent 抽象类,并实现了该抽象类中的抽象方法。由于菜单项不包含其他子元素,因此 addMenuElementremoveMenuElementgetElement 方法的实现都返回了相应的默认值。

何时使用组合模式

当你发现需求中是体现部分与整体层次的结构时 ,以及你 希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时, 就应该考虑用组合模式了。" Java开发窗体用的容器控件java.awt.Container,它继承于java.awt.Component,就有add方法和remove方法,所以在它上面增加控件,比如Button、Label、Checkbox等控件,就变成很自然的事情,这就是典型的组合模式的应用。

相关推荐
technology_x9 分钟前
液冷超充站设备厂家哪家好?2026年功率与散热对比
java·开发语言
LayZhangStrive23 分钟前
Agent开发 - MCP Client使用MCP Server的几种方式(Spring AI)
java·spring ai·mcp
仓三35 分钟前
从 Prompt Engineering 到 Context Engineering:2026 年 Agent 性能提升的隐藏杠杆
java·prompt·context
许彰午44 分钟前
07-SqlBuilder六法
java·开发语言·低代码·架构
孙6903421 小时前
Spring 注入多例 Bean
java·spring
Jul1en_1 小时前
【Java 脚手架】封装通用工具类-3
java·开发语言·redis·缓存·ai·bootstrap·rabbitmq
边境悍匪1 小时前
springboot常用注解
java·spring boot·学习
captain3762 小时前
文件与IO(2)
java·开发语言·windows·java-ee
mqiqe2 小时前
AgentScope Java 2.0 集成 Chat Completions Web:一行依赖让你的 Agent 变身 OpenAI 兼容服务
java·开发语言·前端
qq_589666052 小时前
Java微服务介绍及应用
java·开发语言·微服务