Qt C++设计模式->组合模式
组合模式(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组件,提供灵活且一致的接口。
相关文章:
Qt C++设计模式->组合模式
组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。 组合模式的应用场景 组合…...
Acwing Bellman-Ford SPFA
1. Bellman-Ford 该算法适用于有负权边的情况,注意:如果有负权环的话,最短路就不一定存在了。时间复杂度 O ( m n ) . O(mn). O(mn).该算法可以求出来图中是否存在负权回路,但求解负权回路,通常用SPFA算法,…...
我能禁止使用某协议的ip禁止访问我的资源吗
是的,你可以禁止使用某个协议的IP地址访问你的资源。这种操作通常涉及网络防火墙、服务器配置或应用程序设置,具体方法取决于你的网络环境和使用的技术。以下是一些常见的实现方法: 1. 使用防火墙 大多数防火墙(硬件或软件&…...
快速理解TCP协议(二)——TCP协议中的拥塞控制机制详解
在计算机网络中,TCP(传输控制协议)是一种广泛使用的面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议通过一系列复杂的机制来确保数据的可靠传输,其中拥塞控制是至关重要的一环。本文将深入探讨TCP协议中的拥塞控制机制&…...
Linux:debug: systemtap: ubacktrace
https://docs.huihoo.com/systemtap/sourceware.org/systemtap/SystemTap_Beginners_Guide/ustack.html 这个函数可以帮助将user level的backtrace打印出来。 stap -d /bin/ls --ldd \ -e probe process("ls").function("xmalloc") {print_usyms(ubacktra…...
使用AI进行需求分析的案例研究
生成式 AI 的潜在应用场景似乎无穷无尽。虽然这令人兴奋,但也可能让人不知所措。因此,团队在使用这项技术时需要有明确的目标:关键是要明确生成式 AI 在团队工作中能产生哪些实质性影响。 在软件工程中,一个引人注目的应用场景是…...
Python内置的re库
Python内置的re库是专门用于处理正则表达式的标准库。它提供了一系列函数和类,使得在Python程序中可以使用正则表达式进行字符串的搜索、替换、分割等操作。re库的使用非常广泛,几乎任何需要复杂文本处理的场景都可以用到它。 主要函数 1、complie函数…...
毕业设计选题:基于ssm+vue+uniapp的面向企事业单位的项目申报小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
jQuery 简介⑤属性操作
九、属性操作 jQuery的属性操作方法一览表 $("selector").val(); // 获取第一个匹配元素的value值(一般用于表单控("selector").val("Hello"); // 设置所有匹配元素的value值为"Hello" $("selector").html();// 获取第一个…...
[Linux] Linux操作系统 进程的状态
标题:[Linux] Linux操作系统 进程的状态 个人主页:水墨不写bug (图片来源于网络) 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始: 在校的时候,你一定学过《…...
深入解析Python 中的 sortedcontainers 库:高效的排序数据结构
在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问…...
什么是服务器日志,日志有什么作用?
前言 服务器日志是指服务器等电脑设备或软件的运作记录。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要,因为它们包含了用于调试问题的消息、服务器状态以及其他…...
Codeforces Round 971 (Div. 4)A-G1题解
Codeforces Round 971 (Div. 4) A 就是b - a #include <bits/stdc.h> #define int long longusing namespace std;void solve() {int a, b;cin >> a >> b;cout << b - a << endl; }signed main() {ios::sync_with_stdio(false);cin.tie(0);co…...
QT----基于QML的计时器
赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库,可以对比文档和提交记录学习起来更清晰 QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel c…...
Stable Diffusion的高分辨率修复(Hires.fix)
Stable Diffusion的高分辨率修复(Hires.fix)是一项重要的功能,它旨在提高生成图像的分辨率和细节,从而使画面变得更加清晰和精细。以下是关于Stable Diffusion高分辨率修复(Hires.fix)的详细解释࿱…...
智慧体育馆可视化:实时监控与智能管理
利用图扑可视化技术实现对体育馆的实时监控和数据分析,提升运营效率、观众体验和安全管理水平,打造智能化场馆环境。...
【NLP】基于“检测器-纠错器”中文文本纠错框架
前言 许多方法将中文拼写纠正(检测和纠正给定中文句子中的错误字符)视为序列标注任务,并在句子对上进行微调。一些方法使用错误检测器作为初步任务,然后将检测结果用于辅助后续的错误纠正过程。然而,现有方法在使用检…...
vue 中加载 Mapbox GL JS Examples
Mapbox GL JS 示例 1. Mapbox GL JS的基础使用2. style 的使用2.1. 切换 style2.2. 配置一个第三方 style (添加一个Layer)2.3. 配置一个带有 slot 的 style2.4. 创建一个自定义 style 的 layer 类实现 WebGL 内容2.5. 添加Marker2.6. 添加 geojson 格式…...
Vue3 中组件传递 + css 变量的组合
文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件,根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件: <Arrow color"red" />子组件: <template><div class&…...
秋分之际,又搭建了一款微信记账本小程序
在这个金色的季节里,每一粒粮食都蕴含着生命的奇迹,每一片叶子都在诉说着成长的故事。秋分之际,又搭建了一款微信记账本小程序。 产品概述 微信记账本小程序是一款便捷的个人财务管理工具,旨在帮助用户轻松记录、管理和分析日常…...
NXP S32K3开发日记:PIT0的RTI唤醒功能调试全记录(含时钟源配置误区)
NXP S32K3开发实战:PIT0 RTI唤醒功能深度解析与排错指南 作为一名长期深耕汽车电子领域的嵌入式工程师,最近在基于NXP S32K3系列MCU开发低功耗应用时,遇到了一个颇具挑战性的问题——如何可靠地使用PIT0的RTI(Real Time Interrupt…...
LongCat-Video:AI视频生成技术的范式突破与实践指南
LongCat-Video:AI视频生成技术的范式突破与实践指南 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 在数字内容创作领域,AI视频生成技术正经历从实验性探索到产业化应用的关键转折…...
镜头背后的AI魔法:Qwen-Edit多角度编辑技术的深度探索
镜头背后的AI魔法:Qwen-Edit多角度编辑技术的深度探索 【免费下载链接】Qwen-Edit-2509-Multiple-angles 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Qwen-Edit-2509-Multiple-angles 问题溯源:当静态图像遇见动态视角需求 在博物馆的…...
PS插件加载失败?手把手教你用注册表修复PS2017-2022扩展未签署问题
PS插件加载失败?手把手教你用注册表修复PS2017-2022扩展未签署问题 当你在Photoshop中安装新插件时,突然弹出"扩展未经正确签署"的错误提示,这种挫败感我深有体会。作为一名长期与PS插件打交道的设计师,这个问题几乎成…...
Windows系统效能优化指南:基于Win11Debloat的系统调校方案
Windows系统效能优化指南:基于Win11Debloat的系统调校方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
大模型风口已至!普通人如何逆袭拿高薪?学员真实案例告诉你答案!
在人工智能飞速发展的今天,大模型已成为科技行业的核心赛道,无数人渴望抓住这波风口实现职业跃迁。而我们的大模型学员,用一份份亮眼的 offer,交出了完美答卷! 🌟 平凡起点,非凡逆袭 他们中有**…...
PDB文件管理实战:用符号服务器加速团队协作调试(含VS2022配置示例)
PDB文件管理实战:构建企业级符号服务器加速团队协作调试 当开发团队规模超过10人时,调试符号管理就会从技术问题升级为协作难题。想象这样的场景:周五下午5点,QA报告生产环境出现崩溃转储,开发团队需要立即分析。但当工…...
Pixel Language Portal 集成 Visual Studio Code:智能代码补全插件开发实战
Pixel Language Portal 集成 Visual Studio Code:智能代码补全插件开发实战 1. 为什么开发者需要智能代码补全 想象一下这样的场景:凌晨两点,你正在赶一个紧急项目,手指在键盘上飞舞,但突然卡在一个复杂的函数实现上…...
新手福音:用快马生成交互式cad安装指南,轻松跨过第一道坎
作为一名CAD初学者,第一次安装软件时确实容易手忙脚乱。记得我当初光是找官方下载链接就花了半小时,安装过程中还差点勾选了捆绑软件。后来发现用InsCode(快马)平台可以快速生成交互式安装指南,整个过程变得特别顺畅。今天就把这个实用方法分…...
AI辅助开发Playwright脚本:处理文件上传与iframe交互难题
AI辅助开发Playwright脚本:处理文件上传与iframe交互难题 最近在做一个Web自动化测试项目时,遇到了两个特别头疼的问题:文件上传和iframe内的富文本编辑器交互。作为一个刚接触Playwright不久的开发者,这些复杂交互让我卡了好几天…...
