设计模式-组合模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

[(1) 优点](#(1) 优点)

[(2) 缺点](#(2) 缺点)

模式结构

具体实现

实际应用


定义

组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示"整体-部分"的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。

组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,树形结构图如下。

由上图可以看出,其实根节点和树枝节点本质上属于同一种数据类型,可以作为容器使用;而叶子节点与树枝节点在语义上不属于用一种类型。但是在组合模式中,会把树枝节点和叶子节点看作属于同一种数据类型(用统一接口定义),让它们具备一致行为。

特点

将对象组合成树形结构以表示"部分-整体"的层次结构。

使用场景

    • 在需要表示一个对象整体与部分的层次结构的场合,如树形菜单,文件、文件夹的管理。
    • 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

优缺点

(1) 优点
    • 高层模块调用简单。
    • 节点自由增加。
(2) 缺点
    • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

模式结构

组合模式包含以下主要角色。

    • 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
    • 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
    • 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

具体实现

具体实现类

java 复制代码
/**
 * 部门
 */
public class Department {
    /**
     * 编号
     */
    private String no;

    /**
     * 名称
     */
    private String name;

    /**
     * 级别
     */
    private int level;

    /**
     * 下级部门
     */
    private List<Department> subDepartments;

    public Department(String no, String name) {
        this.no = no;
        this.name = name;
        this.subDepartments = new ArrayList<>();
    }

    /**
     * 添加下级部门
     */
    public void add(Department department) {
        department.level = level + 1;
        subDepartments.add(department);
    }

    /**
     * 删除下级部门
     */
    public void remove(Department department) {
        subDepartments.remove(department);
    }

    /**
     * 获取下级部门列表
     */
    public List<Department> getSubDepartments() {
        return subDepartments;
    }

    @Override
    public String toString() {
        return "Department{" +
                "no='" + no + '\'' +
                ", name='" + name + '\'' +
                ", level=" + level +
                ", subDepartments=" + subDepartments +
                '}';
    }
}

具体使用

java 复制代码
public class App {
    public static void main(String[] args) {
        //公司
        Department company = new Department("000000", "xxx公司");

        //总裁办
        Department ceo = new Department("000001", "总裁办");
        company.add(ceo);

        //人力资源部
        Department hrCenter = new Department("000002", "人力资源部");
        ceo.add(hrCenter);

        //研发部
        Department rdCenter = new Department("000003", "研发部");
        ceo.add(rdCenter);

        //硬件研发部
        Department hardware = new Department("000004", "硬件研发部");
        rdCenter.add(hardware);

        //软件研发部
        Department software = new Department("000005", "软件研发部");
        rdCenter.add(software);

        System.out.println(company);

    }
}

实际应用

1、Android或者其他系统中的View、Window

2、文件系统

相关推荐
风曦Kisaki5 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
毛驴赶鹿6 小时前
低配置服务器怎么搭建监控?Komari Docker部署与公网访问完整教程
运维·服务器·docker
workflower6 小时前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯8 小时前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
冷莫溪9 小时前
Docker——3.Harbor 核心架构与原理详解
docker·容器·架构
安冬的码畜日常10 小时前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
冷莫溪10 小时前
Docker——1.安装与相关命令
运维·服务器·docker·容器
Allen_LVyingbo11 小时前
基于结构化电子病历的临床风险预测模型构建与大模型协同优化
python·安全·机器学习·docker·vim·健康医疗
AI大法师21 小时前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
暖和_白开水1 天前
数据分析agent(十三_3):docker mysql容器镜像服务的异常错误
mysql·docker·容器