首页 > 编程语言 >Qt C++设计模式->组合模式

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

时间:2024-09-23 09:23:56浏览次数:3  
标签:Leaf Qt 组合 Composite C++ 组件 operation 设计模式 name

组合模式(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组件,提供灵活且一致的接口。

标签:Leaf,Qt,组合,Composite,C++,组件,operation,设计模式,name
From: https://blog.csdn.net/m0_46494667/article/details/142449709

相关文章

  • 【C++驾轻就熟】string类以及string类的模拟实现
    目录一、为什么学习string类?二、标准库中的string类 2.1string类(了解)2.2string类的常用接口说明 1.string类对象的常见构造 2.string类对象的容量操作3.string类对象的访问及遍历操作 4.string类对象的修改操作5.string类非成员函数 三、 string类的......
  • 基于Qt的串口调试工具&串口常见问题
    1.项目地址https://github.com/zhangjiechina001/SerialPortTool2.使用注意串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确,设置错了有时会连接上但是传输的数据会很奇怪,有时直接连接不上了串口通信中一般不需要像网络通信那样明确的保活机制(Keep-ali......
  • QTableWidget用法总结
    QTableWidget用法总结直接上代码mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QDateTime>#include<QScrollBar>#include<QFile>#include<QIODevice>QT_BEGIN_NAMESPACEnamespaceUi{class......
  • C++ 列表初始化 {}
    花括号的形式{},进行列表初始化,在C++11中初始化变量到了全面的应用。可参看《C++Primer》P39P76P88等相关内容信息。Note:当我们提供一个类内初始值时,必须以符号=或者花括号表示。《C++Primer》P246。如下:classDog{public:Dog(intage):m_age(age){}......
  • c++中内置函数
    intmain(){autofactorial=[&](intn,auto&&self)->int{if(n<=1)return1;returnn*self(n-1,self);//调用自己};std::cout<<"Factorialof5:"<<factorial(5,factorial)......
  • [OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码
    文章目录前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式2.直方图比较理论基础(1)相关性(Correlation)——HISTCMP_CORREL(2)卡方(Chi-Square)——HISTCMP_CHISQR(3)十字交叉性(Intersection)——HISTCMP_INTERSECT(4)巴氏距离......
  • c++中字符/串->整数
    char字符->整数数字:std::isdigit用于判断某个字符是否为数字(0-9)。字符串->数字:std::stoi用于将字符转换为整数。intisdigit(intch);//std::isdigit接受的参数类型为int,通常会传递字符类型(char)作为参数,但是字符会自动转换为对应的int值。intstoi(conststd::string&......
  • Python&C++迭代器比较
    Python&C++迭代器比较内容在Python和C++中,迭代器的概念都有类似的作用,但它们的实现方式和细节上存在一些区别。下面我们将从迭代器的定义、特性以及Python和C++中的不同点来进行对比。1.什么是迭代器?迭代器是一种对象,它允许你遍历一个集合(如列表、字典、字符串等)中......
  • C++入门——类和对象(上)
    文章目录一、类的定义1.1类的定义格式1.2访问限定符1.3类域二、实例化2.1实例化概念2.2对象大小三、this指针四、C++和C语言实现Stack栈的对比总结一、类的定义1.1类的定义格式class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分......
  • C++ 解析 RDP 协议
    远程桌面协议(RemoteDesktopProtocol,RDP)是微软开发的一种网络通信协议,用于提供远程桌面会话服务。它允许用户通过网络连接至远程计算机,并像使用本地计算机一样操作远程系统。本文档将详细探讨在C++环境中如何解析RDP协议,涵盖协议层次解析、连接过程管理、数据加密解密、......