2023-6-30-第十二式组合模式

news2024/10/7 13:18:42


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之组合模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、组合模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

组合模式是一种设计模式,它允许我们将对象组织成树形结构,并且以相同的方式处理单个对象和组合对象。这意味着客户端无需关心对象是单独的叶子节点,还是以组合形式包含其他子节点。

组合模式主要由三个角色组成:

  1. 组件(Component):定义了组合对象和叶子对象的共同操作接口。可以是接口或抽象类,它可以包含其他组件作为子节点的方法。
  2. 叶子(Leaf):表示组合的叶子对象,实现了组件接口的方法。叶子对象没有子节点。
  3. 组合(Composite):表示包含子节点的组合对象,实现了组件接口的方法。组合对象的方法通常会调用其子节点的方法。

通过使用组合模式,我们可以创建一个递归的结构,其中组合对象可以包含其他组合对象或叶子对象,从而形成一个树形的结构。这使得我们可以以统一的方式对整个树结构执行操作,而无需关心是单个对象还是组合对象。

组合模式常用于处理树形结构的场景,例如文件系统的目录结构、UI控件的嵌套布局等。它提供了一种灵活的方式来处理对象组织结构,并促使我们遵循开闭原则和单一职责原则。


🐱‍🐉二、组合模式实现

以下是一个简单的C++示例,展示了如何使用组合模式来实现一个文件系统的目录结构:

首先,我们定义一个组件(Component)类,包含了共同的操作方法:

class FileSystemComponent {
public:
    virtual void display() = 0;
};

然后,我们实现两个具体的类,一个是叶子(Leaf)类表示文件,另一个是组合(Composite)类表示目录:

#include <iostream>
#include <vector>

class File : public FileSystemComponent {
private:
    std::string name;
public:
    File(std::string _name) : name(_name) {}

    void display() override {
        std::cout << "File: " << name << std::endl;
    }
};

class Directory : public FileSystemComponent {
private:
    std::string name;
    std::vector<FileSystemComponent*> children;
public:
    Directory(std::string _name) : name(_name) {}

    void add(FileSystemComponent* component) {
        children.push_back(component);
    }

    void display() override {
        std::cout << "Directory: " << name << std::endl;
        for (auto child : children) {
            child->display();
        }
    }
};

现在,我们可以使用这些类来构建文件系统的目录结构,并对整个结构执行操作:

int main() {
    File* file1 = new File("file1.txt");
    File* file2 = new File("file2.txt");
    Directory* dir1 = new Directory("dir1");
    dir1->add(file1);
    dir1->add(file2);

    File* file3 = new File("file3.txt");
    Directory* dir2 = new Directory("dir2");
    dir2->add(file3);
    dir2->add(dir1);

    dir2->display();

    delete file1;
    delete file2;
    delete dir1;
    delete file3;
    delete dir2;

    return 0;
}

运行上述代码,将输出以下结果:

Directory: dir2
File: file3.txt
Directory: dir1
File: file1.txt
File: file2.txt

这个示例展示了如何使用组合模式来实现文件系统的目录结构。通过组合模式,我们可以将文件和目录组织成树形结构,并以统一的方式对其进行操作。


🎉三、模块之间的关系

在组合模式中,有以下几个主要角色:

  1. 组件(Component):定义了组合模式中的共同操作方法,可以是包含子组件的复合对象(如目录),也可以是叶子对象(如文件)。组件角色可以是抽象类或接口。

  2. 叶子(Leaf):叶子对象表示组合中的最小单位,它没有子节点。叶子对象实现了组件接口的方法。

  3. 组合(Composite):复合对象,可以包含任意数量的组件和叶子对象。组合对象实现了组件接口的方法,并且可以对其子组件进行管理(添加、删除、遍历等操作)。

在组合模式中,组合对象可以像叶子对象一样被使用,这是因为组合对象和叶子对象都实现了相同的组件接口。这种统一的接口使得组合中的对象可以以统一的方式进行处理,客户端不需要区分是组合对象还是叶子对象。这样可以简化客户端与对象的交互,并通过递归的方式来处理整个组合结构。

组合模式中,组合对象和叶子对象之间的关系可以描述如下:

  1. 组合对象可以包含任意数量的组件和叶子对象,形成一个树形结构。组合对象负责管理其子组件,可以通过递归方式对整个组合结构进行操作。

  2. 叶子对象是组合模式中的最小单位,它没有子节点。叶子对象通常是组合对象的基本构成单元。

  3. 组件接口定义了组合对象和叶子对象共同的操作方法,使得客户端可以以统一的方式对组合对象和叶子对象进行操作。

总结起来,组合模式通过统一的组件接口,使得组合对象和叶子对象可以以统一的方式进行处理,客户端无需区分它们的具体类型。这样,组合模式可以轻松地处理包含组合关系的对象结构,并且可以以一致的方式对其进行操作。


🐱‍🚀四、注意事项

在使用组合模式时,以下是一些需要注意的事项:

  1. 角色辨析:清楚地区分组合对象、叶子对象和共同的组件接口。组合对象可以包含子组件,而叶子对象不能包含子组件。共同的组件接口定义了组合对象和叶子对象共同的操作方法。

  2. 适用性:组合模式适用于处理具有层级结构的对象,其中对象可以被组合成树形结构。如果需要以统一的方式对整个树形结构进行操作,那么组合模式可能是一个有用的选择。

  3. 递归操作:组合模式常常通过递归操作来遍历和处理整个组合结构。在编写递归算法时,要确保递归的结束条件和递归过程的正确性。

  4. 增加和删除组件:组合对象可以动态地增加或删除其子组件。当对组合对象进行增加或删除操作时,要确保维护好整个组合结构的一致性。

  5. 区分操作:某些操作对于组合对象和叶子对象是有意义的,而对于另一种类型的对象则可能是无意义的。这时,需要在执行操作之前做出适当的判断,以避免不必要的操作。

  6. 使用场景:组合模式适用于需要处理对象的层次结构,并且需要以统一的方式进行操作的情况。例如,树形结构、菜单和子菜单、文件系统等都是组合模式的经典应用场景。

以上是使用组合模式时需要注意的一些事项,合理地应用组合模式可以提高代码的复用性和可维护性,同时还能够提供一种更加灵活和统一的方式来处理对象的结构和操作。


🎂五、使用场景

组合模式可以应用于以下场景:

  1. 树形结构:组合模式非常适用于描述树形结构,其中对象可以被组合成树状的层次结构,例如文件系统、组织机构图等。组合模式可以提供一种统一的方式来处理整个树形结构,同时也可以递归地对子节点进行操作。

  2. 菜单和子菜单:在图形用户界面或者网站开发中,常常会遇到需要设计菜单和子菜单的场景。组合模式可以很好地描述菜单和子菜单的层次关系,以及统一处理各个菜单项的操作。

  3. 文件与文件夹:在文件系统中,文件和文件夹之间存在着一种层次结构。使用组合模式可以方便地表示文件和文件夹之间的关系,并且能够以统一的方式来处理它们的操作,例如复制、移动等。

  4. 嵌套结构处理:当存在嵌套结构的对象需要进行处理时,组合模式是一个有用的选择。例如,处理嵌套的配置文件、表单验证规则等,组合模式可以提供一种统一的方式来处理整个结构。

  5. 图形设计工具:图形设计工具中,常常需要处理各种形状的图元对象,并且这些图元对象可以根据需要进行组合和嵌套。组合模式可以很好地描述图元对象之间的关系,并提供一种统一的方式来处理它们。

总的来说,组合模式适用于需要处理对象的层次结构,并且需要以统一的方式进行操作的情况。通过合理地应用组合模式,可以提高代码的复用性和可维护性,同时还能够提供一种更加灵活和统一的方式来处理对象的结构和操作。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于组合模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的tmux的使用

0.前言 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来Linux下tmux的使用。 如果您感兴趣也可以看看我的其他内容。 1.tmux的基础概念 tmux是一款在Linux里运行在终端上的软件&#xff0c;可以使得终端具有强大的多任务管理功能&#xff08;以下是在Ubuntu环…

CSS知识点汇总(八)--Flexbox

1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么&#xff0c;适用什么场景&#xff1f; 1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么 Flexible Box 简称 flex&#xff0c;意为”弹性布局”&#xff0c;可以简便、完整、响应式地实现各种页面布局。采用…

Python高级教程:简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 FastAPI是一个高性能、易于使用、快速编写API的…

新品亮相丨美格智能高性能Cat.1 bis模组SLM332X上市

6月29日&#xff0c;2023 MWC 上海世界移动通信大会火热进行中。展会现场&#xff0c;美格智能正式发布基于芯翼信息科技XY4100芯片平台研发的高性能4G LTE Cat.1 bis模组SLM332X。该产品可广泛应用于智能支付、智慧表计、共享经济、公网对讲机、定位追踪、智能穿戴、安防监控等…

Web3本地搭建truffle智能合约开发环境

之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序&#xff0c;他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能…

基于Java星空游戏购买下载平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

浅谈基于微电网的智慧校园能耗监测系统的设计与产品应用

摘 要&#xff1a;针对高校教学建筑能效监管效率低的问题&#xff0c;从系统总体设计、分层设计、硬件系统设计、软件系统设计、功能测试等方面阐述了一种基于物联网技术的智慧校园建筑能效监管系统。通过对能耗监管系统关键功能的测试&#xff0c;测试效果良好&#xff0c;结果…

处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法 开发人员账号到期时&#xff0c;应采取以下步骤处理APP被下架问题&#xff1a; 登录开发者账号。点击右上角的"账户"&#xff0c;选择"续费"。输入信用卡信息&#xff0c;确保使用…

Android应用卡顿监控方案原理和对比

作者&#xff1a;天才木木木木 0 介绍 要监控应用界面是否发生卡顿&#xff0c;需要先了解一下Android应用主线程的渲染机制&#xff1a; Android 系统提供一个稳定的帧率输出机制&#xff0c;让软件层和硬件层可以以共同的频率一起工作,使我们可以享受稳定帧率的画面。 大部…

多元分类预测 | Matlab鲸鱼算法(WOA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,WOA-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab鲸鱼算法(WOA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,WOA-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

超级实用!详解Node.js中的mongodb模块和socket.io模块

文章目录 9. mongodb 模块安装和引入连接数据库操作集合获取集合插入文档查询文档更新文档删除文档 关闭连接 10. socket.io 模块安装和引入监听连接事件监听自定义事件在服务器端监听事件在客户端触发事件 广播消息在服务器端广播消息在客户端监听广播消息 断开连接完整示例 9…

WPF 零基础入门笔记(3):数据绑定详解

文章目录 文章合集数据绑定数据绑定实战事件通知型数据驱动&#xff0c;双向绑定资源绑定数据源绑定全局数据源后端和前端绑定问题继承事件通知&#xff0c;刷新数据事件通知强制刷新&#xff08;无效&#xff09;结论&#xff1a; 文章合集 WPF基础知识博客专栏 WPF微软文档 …

365天深度学习训练营-第T4周:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow2 一、前期工作&#xff1a; 1、导入…

小白开酒吧前要知道的几个知识(一)

第一、团队建设如果决定开酒吧&#xff0c;除非你的资金充裕&#xff0c;否则都该寻找合伙人。共同的目标会让你和合伙人之间合作的更愉快&#xff0c;所以合伙人应该选择善于沟通交流的。选定靠谱的合伙人之后&#xff0c;应该建立一个大致的团队体系&#xff0c;在团队内做好…

CAD怎么转成清晰的图片?分享几种好用的转换方法

CAD文件通常需要特定软件才能打开和编辑&#xff0c;而将其转换为图片格式可以使其更加普遍地被浏览和共享。此外&#xff0c;由于图片通常具有较小的文件大小&#xff0c;因此转换为图片格式可以更快地上传和下载&#xff0c;可以方便地用于演示和分享。那么我们怎么把CAD文件…

Python进行单元测试是怎么做的?

前言 在我的日常工作中&#xff0c;我是一名专业程序员。我使用c、c#和Javascript。我是一个开发团队的一员&#xff0c;他们使用单元测试来验证我们的代码是否按照它应该的方式工作。 在本文中&#xff0c;我将通过讨论以下主题来研究如何使用Python创建单元测试。 单元测试…

一文详解Mac搭建Vulkan开发环境

本文为Vukan系列的第二篇文章&#xff0c;上一篇文章对Vulkan进行了简单介绍&#xff0c;并对其与OpenGL的优劣势进行了比较&#xff0c;为应用开发人员在选择图形API方面提供了建议。下边开始本文的主要内容&#xff0c;详细介绍在Mac操作系统中&#xff0c;如何搭建Vulkan开发…

力扣 98. 验证二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/validate-binary-search-tree/description/ C题解1&#xff1a;中序遍历&#xff0c;递归法。获取数组&#xff0c;如果是递增则返回true&#xff0c;否则返回false。 class Solution { public:void zhongxu(TreeNode* node…

用vue3+elementplus做的一个滚动菜单栏的组件

目录 起因概览设计及解决思路1.滚动条竖起来2.绑定菜单3.吸附优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider&#xff0c;但是这个感觉很不实用&#xff0c;在底部&#xff0c;而且横向滚动&#xff0c;最常见的应该是那种固定在左上角的带着菜单的滚动条&a…

MySQL总结(索引,Explain,MVCC和隔离级别,锁)

文章目录 一、索引1.索引构成2.如何查找3.最左匹配原则4.覆盖索引5.减少冗余索引和重复索引1.冗余索引2.重复索引 6.索引适用情况和注意事项1.适用情况2.注意事项 二、Explain执行计划1.Explain语句 三、隔离级别与MVCC1.事前准备2.四个事务并发的问题1.脏写2.脏读3.不可重复读…