Qt C++设计模式->组合模式

news2024/9/25 19:17:57

组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。

组合模式的应用场景

组合模式非常适合用于需要处理树形结构的场景,比如文件系统(文件和文件夹)、图形界面(窗口和控件)等。在Qt中,组合模式可以用来管理复杂的UI组件,使得对单个组件和一组组件的操作一致。

组合模式示例代码

#include <QDebug>
#include <QString>
#include <vector>

// 组件接口
class Component {
public:
    virtual void operation() const = 0; // 定义操作方法
    virtual ~Component() = default;
};

// 叶子节点类:表示单个对象
class Leaf : public Component {
private:
    QString name;

public:
    Leaf(const QString& name) : name(name) {}

    void operation() const override {
        qDebug() << "Leaf" << name << "operation";
    }
};

// 组合节点类:表示组合对象
class Composite : public Component {
private:
    QString name;
    std::vector<Component*> children; // 存储子组件

public:
    Composite(const QString& name) : name(name) {}

    void add(Component* component) {
        children.push_back(component); // 添加子组件
    }

    void operation() const override {
        qDebug() << "Composite" << name << "operation";
        for (const auto& child : children) {
            child->operation(); // 递归调用子组件的操作
        }
    }

    ~Composite() {
        for (auto child : children) {
            delete child; // 清理内存
        }
    }
};

// 使用示例
int main() {
    // 创建叶子节点
    Component* leaf1 = new Leaf("A");
    Component* leaf2 = new Leaf("B");

    // 创建组合节点
    Composite* composite = new Composite("C");
    composite->add(leaf1);
    composite->add(leaf2);

    // 进行操作
    composite->operation();  // 输出:Composite C operation; Leaf A operation; Leaf B operation

    // 清理内存
    delete composite;

    return 0;
}

代码解析

  • Component类:定义了统一的接口,所有叶子和组合对象都实现该接口。

  • Leaf类:表示树形结构中的单个对象,实现了操作方法。

  • Composite类:表示组合对象,持有多个子组件,可以添加、删除子组件并递归调用其操作方法。

组合模式的优点

  • 简化代码:客户端可以统一处理单个对象和组合对象,简化了代码。

  • 灵活性:可以轻松扩展新的叶子或组合节点,而不需要修改现有代码。

  • 树形结构:自然地表示部分与整体的层次关系,适合表示复杂结构。

组合模式的缺点

  • 增加复杂性:在简单情况下可能显得过于复杂,增加了系统的理解难度。

  • 不易限制:无法限制组合对象的数量,可能导致过多的组件被添加。

适合使用组合模式的情况

  • 需要表示部分与整体的层次结构时,如图形界面、文件系统等。

  • 需要统一处理单个对象和组合对象的操作时。

通过组合模式,Qt应用程序可以有效管理和操作复杂的UI组件,提供灵活且一致的接口。

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

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

相关文章

jQuery——jQuery的2把利器

1、jQuery 核心函数 ① 简称&#xff1a;jQuery 函数&#xff0c;即为 $ 或者 jQuery ② jQuery 库向外直接暴露的是 $ 或者 jQuery ③ 引入 jQuery 库后&#xff0c;直接使用 $ 即可 当函数用&#xff1a;$&#xff08;xxx&#xff09; 当对象用&#xff1a;$.xxx&#x…

华为官宣,不支持安卓应用的纯血鸿蒙终于来了

华为前不久与苹果新品发布会撞车的全球首款量产三折叠屏幕手机 Mate XT&#xff0c;本以为已是其下半年狠活儿担当。 但直到看完昨天下午的华为秋季全场景发布会才发现&#xff0c;好家伙&#xff0c;此前那都叫小打小闹&#xff0c;原来大招全搁在后头呢&#xff01; 这场近两…

蒙语学习快速方法,速记蒙语单词怎么学习更高效!

要高效学习蒙古语和速记单词&#xff0c;首先要掌握基础知识&#xff0c;如字母表和发音规则。接着&#xff0c;专注于学习日常用语和基础词汇&#xff0c;并运用记忆技巧如联想、发音和构词法来帮助记忆。利用专门的学习软件&#xff0c;如“蒙语学习通”&#xff0c;可以提供…

进程间通信 (一)【管道通信(上)】

目录 1. 概况2. 管道通信的原理2.1 初步理解2.2 深入理解 1. 概况 是什么&#xff1a;两个及以上的进程实现数据层面的交互&#xff0c;称为进程间的通信。 因为进程独立性的存在&#xff0c;所以一个进程无法直接访问另一个进程的数据&#xff0c;即便是父子进程&#xff0c;子…

数字IC设计\FPGA 职位经典笔试面试整理--基础篇2

1. 卡诺图 逻辑函数表达式可以使用其最小项相加来表示&#xff0c;用所有的最小项可以转换为卡诺图进行逻辑项化简 卡诺图讲解资料1 卡诺图讲解资料2 卡诺图讲解资料3 最小项的定义 一个函数的某个乘积项包含了函数的全部变量&#xff0c;其中每个变量都以原变量或反变量的形…

从传统到智能:低代码平台在生产型企业中的应用实践

在全球数字化浪潮的推动下&#xff0c;生产型企业正面临前所未有的变革压力。为了在激烈的市场竞争中保持竞争力&#xff0c;企业迫切需要通过技术手段实现业务流程的优化和创新。然而&#xff0c;传统的软件开发方式往往耗时耗力&#xff0c;难以快速响应市场需求。低代码平台…

一些依赖库的交叉编译步骤

交叉编译链版本&#xff1a;12.3.0 一、curl-7.43.0库交叉编译 libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传&a…

Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 上一章中&#xff0c;我们完成了页面样式的配置&#xff0c;让之前简陋的页面变得漂亮了些。 整理一下目前已经完成的系统&#xff0c;从界面上看&#xff0c;已经完成了以下页面: 首页分类列表页标签列表页口博文详情页 这离我们的需求还有些距离&#xff0…

哪款手机软件适合记事?记事本软件推荐

在这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。它不仅携带方便&#xff0c;而且功能强大&#xff0c;几乎可以完成我们日常所需的所有任务。随着生活节奏的加快&#xff0c;人们越来越需要一个可靠的工具来帮助自己记录重要信息和工作事项。这时候…

德勤校招网申笔试综合能力测试SHL题库与面试真题攻略

德勤的综合能力测试&#xff08;General Ability&#xff09;是其校园招聘在线测评的关键环节&#xff0c;旨在评估应聘者的多项认知能力。以下是对这部分内容的全面整合&#xff1a; 综合能力测试&#xff08;General Ability&#xff09; 测试时长为46分钟&#xff0c;包含…

ORA-12560:TNS:协议适配器错误

今天准备在数据库服务器创建一个用户&#xff0c;使用管理员账号进行登录 sqlplus / as sysdba时&#xff0c;突然报了个ORA-12560&#xff1a;TNS&#xff1a;协议适配器错误&#xff0c;吓的我一激灵&#xff0c;不应该啊&#xff0c;之前一直都是正常的&#xff0c;也是在网…

大漠yolo-数据集标注

参考 【按键精灵】大漠插件yolo环境配置_哔哩哔哩_bilibili 1. 2. 3.启动

MySQL高阶1873-计算特殊奖金

目录 题目 准备数据 分析数据 总结 题目 编写解决方案&#xff0c;计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 M 开头&#xff0c;那么他的奖金是他工资的 100% &#xff0c;否则奖金为 0 。 返回的结果按照 employee_id 排序。 准备数据 Crea…

记录踩坑 uniapp 引入百度地图(微信小程序,H5,APP)

前言 因为公司要求一定要用百度地图,网上引入百度地图的方法说的就三种(插件,异步,webview组件),因为我用的是VUE3 第一种方法引入插件(插件名vue-baidu-map)一直报错vue2没试过反正vue3引进去就是报错第二种方法用异步引入 如果只开发app和h5可以用,微信小程序反正不显示,但…

android studio 批量修改包名 app package name

1、批量修改包名&#xff1a;project view模式 我们可以看到&#xff0c;只可以修改myapplication的部分包名&#xff0c;前面的com.demo这个修改了&#xff0c;可以进行如下设置来达到修改demo的目的。 2、设置下&#xff0c;通过不同的目录来达到批量修改的目的&#xff1a;…

2024最新甄选7款超好用的文档加密软件 | 好用的企业文档加密软件大盘点!赶快码住!

在数字化时代&#xff0c;文档如同古代的锦书密函&#xff0c;承载着企业的智慧与机密。 正如古诗所云&#xff1a;"锦书难托云中雁&#xff0c;密语常藏月下窗。" 2024年&#xff0c;我们不仅要传承古人的智慧&#xff0c;更要借助现代科技的力量&#xff0c;守护…

张朝阳的物理课第三卷:量子力学的硬核探索与启发

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【海拥导航】&#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/HDQZJEQiCJb9cFi&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技…

使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示

Prometheus是一个开源的的监控工具&#xff0c;而且还免费。这一次我们用Prometheus来对之前安装的所有服务&#xff0c;包括Mysql、Redis、系统状况等进行监控&#xff0c;并结合Grafana进行图形化展示 Prometheus下载和安装 下载地址&#xff08;以下所有插件的官方下载地址…

二叉搜索树(来学包会) C++经验+1

目录 什么是二叉搜索树 解二叉搜索树 二叉搜索树的操作 二叉搜索树的插入&#xff08;三步走&#xff09; 二叉搜索树的搜索 二叉搜索树的删除 1.删除的节点是叶子节点 2.删除的节点只有一边的子树 3.删除的节点左子树和右子树都有 详细完整代码 什么是二叉搜索树 二…

MT76X8、MT7621、MT7981和QCA9531的GPIO列表

一、 MT76X8 GPIO列表; 二、 MT7621 GPIO列表; 三、MTK7981 GPIO列表; 四、QCA9531 GPIO列表;