(十 一)趣学设计模式 之 组合模式!

news/2025/2/27 9:04:27

在这里插入图片描述

目录


🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解外观模式请看: (十)趣学设计模式 之 外观模式!

这篇文章带你详细认识一下设计模式中的外观模式

一、 啥是组合模式

想象一下,你正在整理你的电脑文件 📁。 你有文件,也有文件夹。 文件夹里可以包含文件,也可以包含其他文件夹。 你可以对文件和文件夹进行统一的操作,比如复制、删除、移动等等 ✂️。
在这里插入图片描述

组合模式,就是将对象组合成树形结构以表示“整体-部分”的层次结构! 组合模式使得用户对单个对象和组合对象的使用具有一致性 🌳。

简单来说,就是把一组相似的对象组织成树状结构,方便统一管理和操作! 🌲

  • 你想表示“整体-部分”的层次结构: 就像文件夹包含文件和文件夹 📁!
  • 你想让客户端可以统一地处理单个对象和组合对象: 就像你可以对文件和文件夹进行统一的复制、删除操作 ✂️!
  • 你想忽略单个对象和组合对象之间的差异: 就像你不想区分文件和文件夹,都把它们当作“文件系统对象”来处理 📁📄!

二、 为什么要用组合模式

组合模式,好处多多 👍:

  • 表示层次结构: 可以清晰地表示“整体-部分”的层次结构 🌳!
  • 统一操作: 可以统一地操作单个对象和组合对象 ✂️!
  • 简化客户端代码: 客户端不需要区分单个对象和组合对象,代码更简洁 🧹!
  • 扩展性好: 可以方便地添加新的叶子节点和组合节点 ➕!

三、 组合模式的实现方式

组合模式主要包含以下几个角色:

  • Component(组件): 定义组合中叶子节点和组合节点的通用接口。 📁📄 (比如:文件系统对象)
  • Leaf(叶子节点): 表示组合中的叶子节点,没有子节点。 📄 (比如:文件)
  • Composite(组合节点): 表示组合中的组合节点,可以包含叶子节点和其他组合节点。 📁 (比如:文件夹)

代码示例:

java">import java.util.ArrayList;
import java.util.List;

// 组件:文件系统对象
public abstract class FileSystemObject {
    protected String name; // 名称
    protected int level = 0; // 层次级别

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

    public abstract void display(); // 显示

    // 设置层次级别
    public void setLevel(int level) {
        this.level = level;
    }

    // 获取缩进字符串
    protected String getIndentString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append("  "); // 两个空格缩进
        }
        return sb.toString();
    }
}

// 叶子节点:文件
public class File extends FileSystemObject {
    public File(String name) {
        super(name);
    }

    @Override
    public void display() {
        System.out.println(getIndentString() + "文件:" + name);
    }
}

// 组合节点:文件夹
public class Directory extends FileSystemObject {
    private List<FileSystemObject> children = new ArrayList<>(); // 子节点

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

    public void add(FileSystemObject fileSystemObject) {
        children.add(fileSystemObject);
    }

    public void remove(FileSystemObject fileSystemObject) {
        children.remove(fileSystemObject);
    }

    @Override
    public void display() {
        System.out.println(getIndentString() + "文件夹:" + name);
        for (FileSystemObject child : children) {
            child.setLevel(this.level + 1); // 设置子节点的层次级别
            child.display();
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Directory root = new Directory("根目录"); // 创建根目录
        Directory dir1 = new Directory("目录1"); // 创建目录1
        File file1 = new File("文件1.txt"); // 创建文件1
        File file2 = new File("文件2.txt"); // 创建文件2

        root.add(dir1); // 将目录1添加到根目录
        root.add(file1); // 将文件1添加到根目录
        dir1.add(file2); // 将文件2添加到目录1

        root.display(); // 显示根目录
    }
}

分析:

  • FileSystemObject 是组件,定义了文件系统对象的通用接口。
  • File 是叶子节点,表示文件。
  • Directory 是组合节点,表示文件夹,可以包含文件和文件夹。

输出结果:

文件夹:根目录
  文件夹:目录1
    文件:文件2.txt
  文件:文件1.txt

四、 组合模式的优缺点

优点:

  • 表示层次结构 🌳!
  • 统一操作 ✂️!
  • 简化客户端代码 🧹!
  • 扩展性好 ➕!

缺点:

  • 设计较复杂,客户端需要花更多时间理清类之间的层次关系 😫!
  • 不容易限制组合中的组件类型,可能会导致运行时错误 💥!

五、 组合模式的应用场景

  • 你想表示“整体-部分”的层次结构: 就像文件系统 📁!
  • 你想让客户端可以统一地处理单个对象和组合对象: 就像你可以对文件和文件夹进行统一的复制、删除操作 ✂️!
  • GUI组件: GUI组件通常是树形结构,比如窗口包含按钮、文本框等组件。
  • 组织结构: 公司组织结构可以表示为树形结构,部门包含员工和子部门。

六、 总结

  • 组合模式就像把一组相似的对象组织成树状结构,方便统一管理和操作! 🌲
  • 主要包含组件、叶子节点和组合节点三个角色! 🎭
  • 优点是表示层次结构、统一操作、简化客户端代码、扩展性好! 👍
  • 缺点是设计较复杂、不容易限制组合中的组件类型! 👎
  • 适用于需要表示“整体-部分”的层次结构,或者需要统一地处理单个对象和组合对象的场景! 🎯

希望这篇文章能让你彻底理解组合模式! 💯 祝你学习愉快! 😄


http://www.niftyadmin.cn/n/5869842.html

相关文章

道可云人工智能每日资讯|深圳将设立人工智能和机器人产业基金

道可云元宇宙每日简报&#xff08;2025年2月26日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 上海青浦发布国际产业协作元宇宙平台 近日&#xff0c;“2025出海企业与跨境专业服务论坛”在上海青浦区徐泾镇举行。论坛上重磅发布三大全球化服务平台&#xff0c…

免费使用SCI润色神器QuillBot

QuillBot是写SCI论文的英语语法检查、润色等常用网站&#xff0c;但是普通用户会有润色级别与字数等限制。本文用于帮助大家免费使用QuillBot。 1.下载破解插件 https://download.csdn.net/download/bynacqt/90434653 2.将下载好的压缩包文件放置一个文件夹下&#xff0c;然后…

OA办公系统自动渗透测试过程

目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境

NLP09-加强1-对比SVM

支持向量机&#xff08;SVM&#xff09; &#xff08;一&#xff09;导入 SVM 相关库 &#xff08;二&#xff09; 修改模型初始化 &#xff08;三&#xff09; 比较 朴素贝叶斯分类器 SVM分类器 支持向量机&#xff08;SVM&#xff09; 代码修改基于NLP09-朴素贝叶斯问句…

CSS3 圆角:实现与优化指南

CSS3 圆角&#xff1a;实现与优化指南 随着网页设计的发展&#xff0c;CSS3 圆角已经成为了现代网页设计中不可或缺的元素之一。本文将详细讲解 CSS3 圆角的基本用法、实现方式以及优化技巧&#xff0c;帮助您在网页设计中更好地运用这一功能。 一、CSS3 圆角基本用法 1.1 基…

【论文笔记-ICCV 2023】ControlNet:为文本到图像扩散模型添加条件控制

ControlNet&#xff1a;为文本到图像扩散模型添加条件控制 ControlNet 是一种神经网络架构&#xff0c;可以通过空间定位、特定于任务的图像条件来增强大型预训练文本到图像扩散模型。 ControlNet 将其他条件注入神经网络的块中&#xff0c;如下图。 神经块将特征图 x 作为输…

在 Mac mini M2 上 MaxKb配置ollama,API域名无效的解决方案

环境说明 docker方案安装与使用的maxkb 本地ollama安装deekseek r1 解决方案 参考https://bbs.fit2cloud.com/t/topic/4165 mac m1用户&#xff0c;根据github的以下回复&#xff0c;成功绑定域名api 如果你想调用本地的ollama 中的大模型&#xff0c;域名试试&#xff1a;…

说说 Spring MVC 的执行流程

Spring MVC 是一个基于 Java 的轻量级、开源的 Web 框架&#xff0c;用于构建 Web 应用程序。它通过将请求处理的各个阶段解耦&#xff0c;使得开发更加灵活和模块化。以下是 Spring MVC 的执行流程&#xff0c;从用户发起请求到返回响应的整个过程&#xff1a; --- ### 1. 用…