Design patterns--代理模式

news2024/11/15 12:21:00

设计模式之代理模式


我们使用Qt开发大型应用程序时,经常遇见大型程序启动时需要加载一些配置信息、用户末次操作信息,以及算法模型等数据时比较费时,笔者在程序启动时设计欢迎页或加载页等窗体来提示用户程序正在加载某些数据,加载界面运行的时候使用代理模式去读取程序运行所需的数据。

  • 效果演示

在这里插入图片描述

  • 代码
#ifndef CONFIGUREBRIDGE_H
#define CONFIGUREBRIDGE_H

#include <QObject>

#pragma pack(push)
#pragma pack(1)
typedef struct s_DataBaseInfo
{
    QString _ip;
    qint16 _port;
    QString _userName;
    QString _pwd;
    QString _dbName;
    qint32 _saveMark;
    qint32 _logMark;

}DataBaseInfo;
#pragma pack(pop)

class ConfigureBridge : public QObject
{
    Q_OBJECT
public:
    static ConfigureBridge *Instance();
    static void Destroy();
private:
    explicit ConfigureBridge(QObject *parent = nullptr);
    ConfigureBridge(const ConfigureBridge &);
    ConfigureBridge &operator=(const ConfigureBridge &);
    ~ConfigureBridge();

private:
    static ConfigureBridge* _instance;

signals:

public:
    DataBaseInfo g_DBInfo;
};

Q_DECLARE_METATYPE(DataBaseInfo)

#endif // CONFIGUREBRIDGE_H

//-----------------------------
#include "configurebridge.h"

ConfigureBridge* ConfigureBridge::_instance = nullptr;

ConfigureBridge *ConfigureBridge::Instance()
{
    if(_instance == nullptr)
    {
        _instance = new ConfigureBridge();
    }
    return _instance;
}

void ConfigureBridge::Destroy()
{
    if(_instance != nullptr)
    {
        delete _instance;
        _instance = nullptr;
    }
}

ConfigureBridge::ConfigureBridge(QObject *parent) : QObject(parent)
{

}

ConfigureBridge::ConfigureBridge(const ConfigureBridge &)
{

}

ConfigureBridge &ConfigureBridge::operator=(const ConfigureBridge &)
{

}

ConfigureBridge::~ConfigureBridge()
{

}
#ifndef LOADDATA_H
#define LOADDATA_H

#include <QObject>
#include <QFile>
#include <QXmlStreamReader>

// 系统配置文件XML
class ReadXml : public QObject
{
    Q_OBJECT
public:
    explicit ReadXml(QObject *parent = nullptr);

    void readSysCfg();
};

class OP_Subject
{

public:
    virtual void readOperatePointsData() = 0;
};

// 工况点数据Dat
class LoadData : public QObject, public OP_Subject
{
    Q_OBJECT
public:
    explicit LoadData(QObject *parent = nullptr);

    void readOperatePointsData() override;
signals:

};

class OP_Proxy : public QObject, public OP_Subject
{
    Q_OBJECT
public:
    explicit OP_Proxy(QObject *parent = nullptr);

    void readOperatePointsData() override;

private:
    LoadData* m_loadData;
};

#endif // LOADDATA_H

//--------------------------------
#include "loaddata.h"
#include <QDataStream>
#include <QDebug>
#include <QTextCodec>
#include <unistd.h>
#include "configurebridge.h"

ReadXml::ReadXml(QObject *parent) : QObject(parent)
{

}

void ReadXml::readSysCfg()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    QFile file("system_config.xml");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return;
    }

    QXmlStreamReader xmlReader(&file);
    if(xmlReader.hasError())
    {
        qDebug() << "XML error: " << xmlReader.errorString();
        return;
    }

    while (!xmlReader.atEnd() && !xmlReader.hasError())
    {
        xmlReader.readNext();
        if(xmlReader.isStartElement())
        {
            // qDebug() << xmlReader.name().toString();
            if(xmlReader.name().toString() == "ip")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._ip = item;
            }
            else if(xmlReader.name().toString() == "port")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._port = item.toUInt();
            }
            else if(xmlReader.name().toString() == "username")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._userName = item;
            }
            else if(xmlReader.name().toString() == "pwd")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._pwd = item;
            }
            else if(xmlReader.name().toString() == "dbname")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._dbName = item;
            }
            else if(xmlReader.name().toString() == "save_mark")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._saveMark = item.toInt();
            }
            else if(xmlReader.name().toString() == "log_mark")
            {
                QString item = xmlReader.readElementText();
                qDebug() << item;
                ConfigureBridge::Instance()->g_DBInfo._logMark = item.toInt();
            }
        }
        else if(xmlReader.isEndElement())
        {
            // qDebug() << "==End==";
        }
        else if(xmlReader.isCharacters() && !xmlReader.isWhitespace())
        {
            // qDebug() << xmlReader.text().toString();
        }
    }

    file.close();
}

LoadData::LoadData(QObject *parent) : QObject(parent)
{

}

void LoadData::readOperatePointsData()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    sleep(2);
    QFile file("op_info.dat");
    if(!file.open(QIODevice::ReadOnly))
    {
        return;
    }

    QString strBinary;
    QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    QDataStream dataStream(&file);
    while (!dataStream.atEnd())
    {
        QByteArray tmpLine = file.readLine();
        strBinary += codec->toUnicode(tmpLine.trimmed());
    }
    file.close();

    qDebug() << strBinary;

    sleep(2);
    qDebug() << "Data loading completed ^_^";
}


OP_Proxy::OP_Proxy(QObject *parent) : QObject(parent)
{
    m_loadData = nullptr;
}

void OP_Proxy::readOperatePointsData()
{
    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
    if(m_loadData == nullptr)
    {
        m_loadData = new LoadData();
    }

    m_loadData->readOperatePointsData();
}
#ifndef SYSTEMCONFIG_H
#define SYSTEMCONFIG_H

#include <QObject>
#include "welcomefrm.h"
#include "loaddata.h"

/**
 * 1、加载系统配置信息
 * 2、加载工况点数据
 */

class SystemConfig : public QObject
{
    Q_OBJECT
public:
    explicit SystemConfig(QObject *parent = nullptr);

    void read_system_config();
    void closeWelPage();

signals:

private:
    WelcomeFrm* m_welFrm;
    ReadXml* m_readXmlCfg;
    OP_Proxy* m_opProxy;
};

#endif // SYSTEMCONFIG_H

//--------------------------------------
#include "systemconfig.h"
#include <QCoreApplication>

SystemConfig::SystemConfig(QObject *parent) : QObject(parent)
{
    m_welFrm = new WelcomeFrm();
    m_readXmlCfg = new ReadXml(this);
    m_opProxy = new OP_Proxy(this);
}

void SystemConfig::read_system_config()
{
    m_welFrm->show();
    QCoreApplication::processEvents();

    m_readXmlCfg->readSysCfg();
    m_opProxy->readOperatePointsData();
}

void SystemConfig::closeWelPage()
{
    m_welFrm->hide();
    m_welFrm->deleteLater();
    m_welFrm = nullptr;
}
#ifndef WELCOMEFRM_H
#define WELCOMEFRM_H

#include <QWidget>

namespace Ui {
class WelcomeFrm;
}

class WelcomeFrm : public QWidget
{
    Q_OBJECT

public:
    explicit WelcomeFrm(QWidget *parent = nullptr);
    ~WelcomeFrm();

    void initSystemCfg();

private:
    Ui::WelcomeFrm *ui;
};

#endif // WELCOMEFRM_H

//------------------------------------
#include "welcomefrm.h"
#include "ui_welcomefrm.h"
#include <QPalette>
#include <QPixmap>

WelcomeFrm::WelcomeFrm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::WelcomeFrm)
{
    ui->setupUi(this);
    //去掉窗口边框
    this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

    QPalette pal = this->palette();
    pal.setBrush(QPalette::Background, QBrush(QPixmap(":/res/welcome.jpg")));
    setPalette(pal);

    ui->label->setStyleSheet("QLabel{color: rgb(255,0,255);"
                             "border: 1px solid green; border-radius: 2px;"
                             "font-size: 30px; font-weight:bold;}");

    ui->label->setText("数据加载中...");

    printf("[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);
}

WelcomeFrm::~WelcomeFrm()
{
    delete ui;
}

void WelcomeFrm::initSystemCfg()
{
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWidget; }
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();

private:
    Ui::MainWidget *ui;
};
#endif // MAINWIDGET_H

//--------------------------------
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include "configurebridge.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    ui->textEdit->setReadOnly(true);
    ui->textEdit->setStyleSheet("QTextEdit{background: #033441;"
                                "color:#64eefa;"
                                "border:1px solid #64eefa;"
                                "font-size: 30px;"
                                "font-weight:bold;}");

    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._ip);
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._port));
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._userName);
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._pwd);
    ui->textEdit->append(ConfigureBridge::Instance()->g_DBInfo._dbName);
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._saveMark));
    ui->textEdit->append(QString::number(ConfigureBridge::Instance()->g_DBInfo._logMark));
}

MainWidget::~MainWidget()
{
    delete ui;
}
#include <QApplication>
#include <QElapsedTimer>
#include <QMetaType>
#include <unistd.h>
#include "configurebridge.h"
#include "systemconfig.h"
#include "mainwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qRegisterMetaType<DataBaseInfo>("DataBaseInfo");

    // 加载系统的配置数据
    SystemConfig sysCfg;
    sysCfg.read_system_config();

    MainWidget w;
    w.show();
    sysCfg.closeWelPage();

    return a.exec();
}

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

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

相关文章

基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查

基于SSM框架的《超市订单管理系统》Web项目开发&#xff08;第五天&#xff09;供应商管理&#xff0c;增删改查 上一次我们实现了多表关联查询&#xff0c;还有分页显示数据的功能。还完善了用户管理这一模块。 因此今天我们需要完成的是供应商管理模块&#xff0c;这一模块…

SQL自学通之表达式条件语句与运算

目录 一、目标 二、表达式条件语句 1、表达式&#xff1a; 2、条件 2.1、WHERE 子句 三、运算 1、数值型运算: 1.1、加法() 1.2、减法 (-) 1.3、除法&#xff08;/&#xff09; 1.4、乘法 &#xff08;*&#xff09; 1.5、取模 &#xff08;%&#xff09; 优先级别…

第24章:Kubernetes Helm Introduction

目录 1. Helm简介2. Helm Charts文件&#xff08;.tgz&#xff09;组成3. Helm核心术语&#xff1a;4. Helm常用命令&#xff1a;5. DIY简单Helm Charts参考链接 1. Helm简介 Helm用于管理Kubernetes应用程序&#xff0c;Helm Charts可以用于定义、安装和升级最复杂的Kubernet…

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 预习计算内容根据运放的非线…

Android加载AnimatedImageDrawable播放gif动态图,Kotlin

Android加载AnimatedImageDrawable播放gif动态图&#xff0c;Kotlin import android.graphics.ImageDecoder import android.graphics.ImageDecoder.OnHeaderDecodedListener import android.graphics.drawable.AnimatedImageDrawable import android.os.Bundle import android…

SVG-椭圆弧-参数转换-计算公式-标准解读

文章目录 1.简介2.基本参数2.1.椭圆的表达2.2.参数变换2.3.注意事项 3.参考资料4.总结 1.简介 为了与其他路径段表示法保持一致&#xff0c; SVG 路径中的圆弧是根据曲线上的起点和终点定义的。椭圆弧的这种端点参数化。优点是它允许与其它路径一致的语法&#xff0c;其中所有…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章&#xff1a; Spring Security 6.x 系列&#xff08;4&#xff09;—— 基于过滤器链的源码分析&#xff08;一&#xff09;中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

深入学习锁--Synchronized各种使用方法

一、什么是synchronized 在Java当中synchronized通常是用来标记一个方法或者代码块。在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个线程执行被synchronized修饰的方法或者代码块。因此被synchronized修饰的方法或者代码块不会出现数据竞争的情况&#x…

Spring Boot中使用Swagger

1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…

ARM与大模型,狭路相逢

编辑&#xff1a;阿冒 设计&#xff1a;沐由 从去年底至今&#xff0c;伴随着OpenAI旗下ChatGPT的火爆&#xff0c;一波AI大模型推动着AI应用全面进入了大模型时代。与此同时&#xff0c;随着边缘算力的提升&#xff0c;AI大模型的部署也逐渐从云端涉入到边缘。 世界对AI算力的…

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地&#xff1a;代码开发 代码开发&#xff1a;SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用&#xff1a;分层体系、建模实现 2. 内容目标 项目业务介绍&#xff1a;背景、需求 项目技术架构&#xff1a;选型、架构 项目环境…

Selenium 自动化高级操作与解决疑难杂症,如无法连接、使用代理等

解决 Selenium 自动化中的常见疑难杂症 这里记录一些关于 Selenium的常用操作和疑难杂症。 有一些细节的知识点就不重复介绍了&#xff0c;因为之前的文章中都有&#xff01; 如果对本文中的知识点有疑问的&#xff0c;可以先阅读我以前分享的文章&#xff01; 知识点&…

1-4、调试汇编程序

语雀原文链接 文章目录 1、执行过程第一步&#xff1a;源程序第二步&#xff1a;编译连接第三步&#xff1a;执行 2、DOSBox运行程序第1步 进入EDIT.EXE第2步 编写源程序第3步 编译第4步 连接第5步 执行完整过程 3、DEBUG跟踪执行过程加载程序到内存执行程序debug和源程序数字…

【导航控制器总结-导航控制器栈 Objective-C语言】

一、导航控制器总结 1.我们接着上一堂课的内容继续 我们上节课说到哪里了,是不是就是对这个导航控制器的一个总结啊 然后,使用的注意事项 2.导航控制器使用注意事项: 1)第一点,使用导航控制器,你在创建的时候,需要给它指定一个根控制器 创建导航控制器的同时,指定…

【译】如何在调试时分析CPU和内存(Analyze CPU and Memory while Debugging)

您想了解如何使您的代码运行得更快&#xff0c;使用更少的内存&#xff0c;或者只是找出您的代码是否有CPU或内存问题?你当然会——你是一名开发人员!但是&#xff0c;内存和性能调优经常会遇到“重要但不紧急”的任务&#xff0c;因为真正紧急的事情&#xff0c;您似乎根本无…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用&#xff0c;它涉及跟踪在数据库上执行的所有 SQL 语句&#xff0c;从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解&#xff0c;使其成为确…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

[ 蓝桥杯Web真题 ]-外卖给好评

目录 介绍 准备 目标 效果 规定 思路 解答参考 介绍 外卖是现代生活中必备的一环。收到外卖后&#xff0c;各大平台软件常常会邀请用户在口味&#xff0c;配送速度等多个方面给与评分。在 element-ui 组件中&#xff0c;已经有相应的 Rate 组件&#xff0c;但是已有组件…

论文解读--PointPillars- Fast Encoders for Object Detection from Point Clouds

PointPillars--点云目标检测的快速编码器 摘要 点云中的物体检测是许多机器人应用(如自动驾驶)的重要方面。在本文中&#xff0c;我们考虑将点云编码为适合下游检测流程的格式的问题。最近的文献提出了两种编码器;固定编码器往往很快&#xff0c;但牺牲了准确性&#xff0c;而…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间&#xff0c;查看网络资源也一直没找到解决方法&#xff0c;今天查看Latex官方文档&#xff0c;才发现因为mul…