首页 > 编程语言 >Qt C++设计模式->建造者模式

Qt C++设计模式->建造者模式

时间:2024-09-13 09:24:12浏览次数:13  
标签:Qt 对象 建造 模式 C++ override QString report 设计模式

建造者模式简介

建造者模式(Builder Pattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂对象。建造者模式允许你分步骤创建复杂对象,并且你可以控制每个步骤如何执行。该模式常用于对象的创建过程非常复杂且需要有多个可选参数的场景。

建造者模式的应用场景

假设你在开发一个复杂的报告生成器应用程序,不同的报告可能有不同的格式、内容、样式等。例如,PDF格式的报告和HTML格式的报告的生成方式和结构都不同。这时你可以使用建造者模式,将生成报告的步骤封装在不同的建造者中,这样可以更灵活地构建复杂的报告对象。

建造者模式示例代码

#include <QDebug>
#include <QString>

// 报告类:包含标题、内容、页眉、页脚等属性
class Report {
public:
    QString title;
    QString content;
    QString header;
    QString footer;

    void show() const {
        qDebug() << "Title:" << title;
        qDebug() << "Content:" << content;
        qDebug() << "Header:" << header;
        qDebug() << "Footer:" << footer;
    }
};

// 报告建造者接口:定义构建报告各部分的抽象方法
class ReportBuilder {
public:
    virtual ~ReportBuilder() = default;
    virtual void buildTitle(const QString &title) = 0;
    virtual void buildContent(const QString &content) = 0;
    virtual void buildHeader(const QString &header) = 0;
    virtual void buildFooter(const QString &footer) = 0;
    virtual Report* getResult() = 0;
};

// PDF报告建造者:具体实现了PDF格式报告的建造步骤
class PDFReportBuilder : public ReportBuilder {
private:
    Report* report;
public:
    PDFReportBuilder() {
        report = new Report();
    }

    void buildTitle(const QString &title) override {
        report->title = "[PDF Title] " + title;
    }

    void buildContent(const QString &content) override {
        report->content = "[PDF Content] " + content;
    }

    void buildHeader(const QString &header) override {
        report->header = "[PDF Header] " + header;
    }

    void buildFooter(const QString &footer) override {
        report->footer = "[PDF Footer] " + footer;
    }

    Report* getResult() override {
        return report;
    }
};

// HTML报告建造者:具体实现了HTML格式报告的建造步骤
class HTMLReportBuilder : public ReportBuilder {
private:
    Report* report;
public:
    HTMLReportBuilder() {
        report = new Report();
    }

    void buildTitle(const QString &title) override {
        report->title = "<h1>" + title + "</h1>";
    }

    void buildContent(const QString &content) override {
        report->content = "<p>" + content + "</p>";
    }

    void buildHeader(const QString &header) override {
        report->header = "<header>" + header + "</header>";
    }

    void buildFooter(const QString &footer) override {
        report->footer = "<footer>" + footer + "</footer>";
    }

    Report* getResult() override {
        return report;
    }
};

// 指挥者类:负责指挥建造者一步步构建复杂的对象
class ReportDirector {
public:
    void constructReport(ReportBuilder* builder) {
        builder->buildTitle("Annual Report");
        builder->buildContent("This is the content of the annual report.");
        builder->buildHeader("Company Name");
        builder->buildFooter("Page 1");
    }
};

// 使用示例
int main() {
    ReportDirector director;

    // 使用PDF建造者
    PDFReportBuilder pdfBuilder;
    director.constructReport(&pdfBuilder);
    Report* pdfReport = pdfBuilder.getResult();
    pdfReport->show();
    delete pdfReport;

    // 使用HTML建造者
    HTMLReportBuilder htmlBuilder;
    director.constructReport(&htmlBuilder);
    Report* htmlReport = htmlBuilder.getResult();
    htmlReport->show();
    delete htmlReport;

    return 0;
}

代码解析

  • Report类:这是一个复杂对象,包含标题、内容、页眉、页脚等属性。该对象将由建造者逐步创建。

  • ReportBuilder接口:这是一个抽象接口,定义了创建复杂对象的各个步骤,包括构建标题、内容、页眉、页脚的方法。不同的具体建造者可以实现这个接口来创建不同格式的报告。

  • PDFReportBuilder和HTMLReportBuilder:它们是具体的建造者,实现了如何创建PDF和HTML格式报告的逻辑。每个建造者负责特定格式报告的构建步骤。

  • ReportDirector类:这个类负责指导建造者一步步地创建复杂对象。在这个例子中,它会调用建造者的方法来构建完整的报告对象。

  • 使用示例:在main函数中,首先创建一个PDF报告建造者,使用指挥者构建完整的PDF报告。然后,类似地创建一个HTML格式的报告。

建造者模式的优点

  1. 分步构建复杂对象:建造者模式允许将复杂对象的创建过程分解为多个步骤,且这些步骤可以独立变化。
  2. 代码的可扩展性强:如果以后需要增加新的报告格式,只需新增一个具体的建造者类,而无需修改原有的代码。
  3. 清晰的代码结构:使用建造者模式可以避免将复杂对象的构建逻辑混杂在一起,使代码更加清晰易读。

与工厂模式的区别

工厂模式专注于创建单一对象,而建造者模式则注重一步步构建一个复杂对象。在建造者模式中,整个构建过程是可控的,而工厂模式一般会直接返回完整的对象。

这个例子展示了如何使用建造者模式构建复杂的报告对象,并通过不同的建造者实现了报告格式的灵活切换。在实际开发中,建造者模式非常适合用于对象的创建过程繁杂且需要多个可选参数的场景。

标签:Qt,对象,建造,模式,C++,override,QString,report,设计模式
From: https://blog.csdn.net/m0_46494667/article/details/142201349

相关文章

  • QT 事件拖动窗口
    //上面缺号头文件,自行添加哦classDragtidgetFilter:publicQobject{public:DragWidgetFilter(QObject*parent):Q0bject(parent){}//重写事件booleventFilter(Qobject*object,QEvent*event){auton=dynanic_cast<QWidget*>(object);......
  • VSCode配置C++环境
    前言VSCode作为一款“宇宙级”的编辑软件,为用户提供了丰富的插件。本文是一片保姆级关于VSCode配置C++环境教程;步骤一:MinGW安装MinGW(MinimalistGNUforWindows)是一款在Windows平台使用的开发工具集,提供了C/C++编译工具。MinGW下载地址:WinLibs-适用于Windows的GCC+Mi......
  • QT QSystemTrayIcon创建系统托盘区图标失败
    前言在开发个人项目时,需要在Windows系统托盘区创建一个图标,在代码中,我使用的是QT的QSystemTrayIcon类进行图标创建,但是在加上图片资源后,一直没有图标显现。我使用的是Qt6,Windows11系统。示例代码QSystemTrayIcon*trayIcon=newQSystemTrayIcon(this);trayIco......
  • Interpreter 设计模式
    实际用途:简单的计算器假设我们要实现一个简单的计算器,可以解析并计算基本的数学表达式,包括加法、减法、乘法和除法。这个计算器将能够处理表达式如"3+5*(2-8)"。使用解释器模式的代码示例1.表达式接口java复制代码interfaceExpression{intinterpret();}......
  • pyqt、pyside界面关闭后自动保存已设置参数
    超简单、低耦合!pyqt、pyside界面关闭后自动保存已设置参数文章目录超简单、低耦合!pyqt、pyside界面关闭后自动保存已设置参数前言正文初始思路实现思路1.`getattr()`:用于返回一个对象的属性值。2.`findChildren()`:获得满足条件的所有子对象代码实现`restore_scr......
  • C++创建与调用dll动态链接库
    C++创建与调用dll动态链接库(MinGW64Dev-C++)本文使用的是dev-c++,如果涉及到VC++中不一样的操作,也会适当进行区分。项目一:创建DLL1、创建一个DLL类型的项目,当前命名为dlltest,并选择合适的路径进行保存。 2、在生成的预设置代码中,加入如下代码//这是头文件dll.h#ifndef_D......
  • 设计模式——UML类图
    UML类图UML基本介绍UML——UnifiedmodelinglanguageUML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于述软件模型中的各个元素和他们之间的......
  • 软件设计模式-单例模式
    单例模式(SingletonPattern)是创建型设计模式的一种,旨在确保一个类在整个应用程序运行期间只有一个实例,并提供全局访问点来获取该实例。这种模式对于那些希望在整个系统中共享唯一对象的场景非常有用,比如数据库连接、日志系统、配置管理器等。单例模式的核心要点唯一实例:类只能有......
  • C/C++ 学生管理系统的文件读取与写入
    代码中文件读取函数read_file()存在一些问题,望指出.`#includeincludedefineSIZE100usingnamespacestd;staticintnums_stu=0;typedefstructStudent{char*name;char*ID; //占10个字符doublescore_one;doublescore_two;doublescore_three;doubletota......
  • C++中的基本运算符----逻辑运算符(&&、||、!)的实例讲解
    在C++中,逻辑运算符用于处理布尔值(true和false),并用于复合条件的判断。主要的逻辑运算符包括:目录1.逻辑与运算符(&&):2.逻辑或运算符(||):3.逻辑非运算符(!):1.逻辑与运算符(&&):当且仅当两个操作数都为true时,结果才为true。示例:if(a>0&&b>0)下面......