设计模式(九):组合模式

设计模式(九):组合模式

  • [1. 组合模式的介绍](#1. 组合模式的介绍)
  • [2. 组合模式的类图](#2. 组合模式的类图)
  • [3. 组合模式的实现](#3. 组合模式的实现)

1. 组合模式的介绍

组合模式(Composite Pattern)属于结构型模式,是用于把一组相似的对象当作一个单一的对象。

组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式它创建了对象组的树形结构。

2. 组合模式的类图

表示一个公司的组织结构,创建一个组织对象,组织对象中包含多个子组织。

3. 组合模式的实现

java 复制代码
package blog;

import java.util.List;

/**
 * 组织结构
 */
public class Organization {
    private String name;

    private List<Organization> organizations;

    public Organization(String name, List<Organization> organizations) {
        this.name = name;
        this.organizations = organizations;
    }

    public void add(Organization organization) {
        organization.add(organization);
    }

    public void remove(Organization organization) {
        organization.remove(organization);
    }

    public List<Organization> getOrganizations() {
        return organizations;
    }
}
java 复制代码
package blog;

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

public class CompositeDemo {
    public static void main(String[] args) {
        Organization organization = new Organization("总裁办", new ArrayList<>());

        Organization sub1 = new Organization("财务部门", new ArrayList<>());

        Organization sub2 = new Organization("业务部门", new ArrayList<>());

        Organization sub3 = new Organization("研发部门", new ArrayList<>());

        Organization sub4 = new Organization("生产部门", new ArrayList<>());

        Organization sub5 = new Organization("客服部门", new ArrayList<>());

        Organization sub11 = new Organization("会计部门", new ArrayList<>());

        Organization sub12 = new Organization("出纳部门", new ArrayList<>());

        organization.getOrganizations().add(sub1);
        organization.getOrganizations().add(sub2);
        organization.getOrganizations().add(sub3);
        organization.getOrganizations().add(sub4);
        organization.getOrganizations().add(sub5);

        sub1.getOrganizations().add(sub11);
        sub1.getOrganizations().add(sub12);

        showOrganization(organization, 0);
    }

    private static void showOrganization(Organization organization, int indentation) {
        for (int i = 0; i < indentation; i++) {
            System.out.print(" ");
        }
        System.out.println(organization.getName());

        List<Organization> organizations = organization.getOrganizations();

        if (!organizations.isEmpty()) {
            organizations.forEach(sub -> {
                showOrganization(sub, indentation + 2);
            });
        }

    }
}
相关推荐
维天说1 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19941 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充2 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充2 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品2 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘2 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记3 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵3 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室4 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发