Design patterns--代理模式

设计模式之代理模式


我们使用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_OBJECTpublic: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_NAMESPACEclass MainWidget : public QWidget
{Q_OBJECTpublic: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.hqwc.cn/news/247671.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『亚马逊云科技产品测评』活动征文|基于亚马逊EC2云服务器安装Prometheus数据可视化监控

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

新华三数字大赛复赛知识点 VLAN基本技术

VLAN IEEE 802.1Q 交换机端口类型 MVRP协议 VLAN Virtual LAN虚拟局域网。LAN可以是由几台少数家用计算机构成的网络&#xff0c;也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络–也就是广播域。将一个物理的局域网在逻辑上划分成多个广播域…

STK Components 二次开发-飞行器

1.创建飞机 参数帮助文档 var poitList GetTracksData(); var waypointPropagator new WaypointPropagator(m_earth, poitList); var locationPoint waypointPropagator.CreatePoint();m_aircraft new Platform {Name "MH730",LocationPoint locationPoint,Or…

算符优先语法分析程序设计与实现

制作一个简单的C语言词法分析程序_用c语言编写词法分析程序-CSDN博客文章浏览阅读378次。C语言的程序中&#xff0c;有很单词多符号和保留字。一些单词符号还有对应的左线性文法。所以我们需要先做出一个单词字符表&#xff0c;给出对应的识别码&#xff0c;然后跟据对应的表格…

6、原型模式(Prototype Pattern,不常用)

原型模式指通过调用原型实例的Clone方法或其他手段来创建对象。 原型模式属于创建型设计模式&#xff0c;它以当前对象为原型&#xff08;蓝本&#xff09;来创建另一个新的对象&#xff0c;而无须知道创建的细节。原型模式在Java中通常使用Clone技术实现&#xff0c;在JavaSc…

Java架构师技术架构路线

目录 1 概论2 如何规划短中长期的技术架构路线图3 如何规划面向未来的架构4 如何修订路线图执行过程中的偏差5 如何落地路线图-阿里系糙快猛之下的敏捷模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 概论 首先,规划一个短中长期的技术路线图是非常重要的。短中…

创新领航 | 竹云参编《基层智治系统安全接入规范》团体标准正式发布!

近日&#xff0c;由杭州市委办公厅&#xff08;市密码管理局&#xff09;、杭州市基层治理综合指挥保障中心、杭州市拱墅区社会治理中心、杭州市拱墅区数据资源管理局、杭州竹云数字智能科技有限公司、杭州智诚质量标准技术评定中心共同参与编写的《基层智治系统安全接入规范》…

【Linux下如何生成coredump文件】

一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满足一定条件下&#xff08;这里为什么说需要满足一定的条件呢&#…

快速处理Python爬虫:异步和缓存技巧

在当今的数字化时代&#xff0c;数据是商业的核心&#xff0c;而爬虫程序是获取数据的重要工具。Python作为一种流行的编程语言&#xff0c;提供了许多库以方便快捷地创建爬虫程序。本文将探讨如何使用Python快速处理爬虫的异步和缓存技巧。 异步处理 Python的异步处理主要通…

Python小案例:打印10以内的素数

解析 1、利用循环控制范围&#xff08;1,100&#xff09; 2、通过循环判断素数 3、利用标记法进行打印素数 代码 #求1——100之间的素数 for i in range(2,101):is_primeNum Truefor j in range(2,i):if i%j 0:# print(f"{i}不是素数")is_primeNum Falseif is_…

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代&#xff0c;恶意攻击者的主要攻击手法是将可执行脚本&#xff08;WebShell&#xff09;上传至目标服务器&#xff0c;以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个&#xff1a; 1.可以上传对应的脚本文件&#xff0c;…

探索 SSO 的世界:简化登录流程的最佳实践(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…