一个使用接口模式、工厂模式、模板方法模式的日志文件系统
引言:
编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式:
-
接口模式(Interface Pattern):定义接口类,并让具体实现类去实现该接口的功能。
-
工厂模式(Factory Pattern):根据不同条件动态生成不同的对象实例。
-
模板方法模式(Template Method Pattern):父类定义方法的结构,子类实现具体逻辑。
-
多线程处理:创建子类继承自
QThread,并实现线程中的具体逻辑。
示例代码设计:
-
核心逻辑:一个简单的日志系统,根据日志等级(如"info"、"warning"、"error")动态生成不同的日志处理线程,并执行相应的日志输出。
-
工厂模式:工厂方法根据日志类型生成不同的处理线程。
-
模板方法模式:每个日志处理线程继承自基类,基类定义通用处理逻辑,子类实现具体日志输出。
示例代码
1. 日志处理接口定义
cpp复制代码#ifndef LOGHELPERINTERFACE_H
#define LOGHELPERINTERFACE_H
#include <QString>
#include <QVector>
class LogHelperInterface
{
public:virtual ~LogHelperInterface() {}
// 记录日志virtual void logMessage(const QString& message) = 0;
};
#endif // LOGHELPERINTERFACE_H
2. 基础日志引擎类
cpp复制代码#ifndef LOGENGINE_H
#define LOGENGINE_H
#include <QMap>
#include <QThread>
#include "loghelperinterface.h"
class LogEngine : public QObject
{Q_OBJECT
public:LogEngine(int logID, LogHelperInterface* helper);~LogEngine();
void logMessage(const QString& message);
static LogEngine* getEngine(const int& logID);
private:static QMap<int, LogEngine*> m_logMap; // 用于存储不同日志引擎实例
int m_logID;LogHelperInterface* m_pHelper;
};
#endif // LOGENGINE_H
3. 基础日志处理线程类
cpp复制代码#ifndef LOGTHREADBASE_H
#define LOGTHREADBASE_H
#include <QThread>
#include "loghelperinterface.h"
class LogThreadBase : public QThread
{Q_OBJECT
public:explicit LogThreadBase(LogHelperInterface* helper, QObject* parent = nullptr);
static LogThreadBase* createLogHandler(const QString& logType, LogHelperInterface* helper);
virtual void handleLog(const QString& message) = 0;
protected:LogHelperInterface* m_logHelper;
};
#endif // LOGTHREADBASE_H
4. 工厂模式实现
cpp复制代码#include "logthreadbase.h"
#include "infologthread.h"
#include "warninglogthread.h"
#include "errorlogthread.h"
LogThreadBase* LogThreadBase::createLogHandler(const QString& logType, LogHelperInterface* helper)
{if (logType == "info") {return new InfoLogThread(helper);} else if (logType == "warning") {return new WarningLogThread(helper);} else if (logType == "error") {return new ErrorLogThread(helper);}
return nullptr;
}
5. 基础日志处理线程类实现
cpp复制代码#include "logthreadbase.h"
LogThreadBase::LogThreadBase(LogHelperInterface* helper, QObject* parent): QThread(parent), m_logHelper(helper)
{
}
6. InfoLogThread 具体实现
cpp复制代码#ifndef INFOLOGTHREAD_H
#define INFOLOGTHREAD_H
#include "logthreadbase.h"
class InfoLogThread : public LogThreadBase
{Q_OBJECT
public:explicit InfoLogThread(LogHelperInterface* helper, QObject* parent = nullptr);
void handleLog(const QString& message) override;
};
#endif // INFOLOGTHREAD_H
cpp复制代码#include "infologthread.h"
#include <QDebug>
InfoLogThread::InfoLogThread(LogHelperInterface* helper, QObject* parent): LogThreadBase(helper, parent)
{
}
void InfoLogThread::handleLog(const QString& message)
{qDebug() << "INFO: " << message;m_logHelper->logMessage("INFO: " + message);
}
7. WarningLogThread 具体实现
cpp复制代码#ifndef WARNINGLOGTHREAD_H
#define WARNINGLOGTHREAD_H
#include "logthreadbase.h"
class WarningLogThread : public LogThreadBase
{Q_OBJECT
public:explicit WarningLogThread(LogHelperInterface* helper, QObject* parent = nullptr);
void handleLog(const QString& message) override;
};
#endif // WARNINGLOGTHREAD_H
cpp复制代码#include "warninglogthread.h"
#include <QDebug>
WarningLogThread::WarningLogThread(LogHelperInterface* helper, QObject* parent): LogThreadBase(helper, parent)
{
}
void WarningLogThread::handleLog(const QString& message)
{qDebug() << "WARNING: " << message;m_logHelper->logMessage("WARNING: " + message);
}
8. ErrorLogThread 具体实现
cpp复制代码#ifndef ERRORLOGTHREAD_H
#define ERRORLOGTHREAD_H
#include "logthreadbase.h"
class ErrorLogThread : public LogThreadBase
{Q_OBJECT
public:explicit ErrorLogThread(LogHelperInterface* helper, QObject* parent = nullptr);
void handleLog(const QString& message) override;
};
#endif // ERRORLOGTHREAD_H
cpp复制代码#include "errorlogthread.h"
#include <QDebug>
ErrorLogThread::ErrorLogThread(LogHelperInterface* helper, QObject* parent): LogThreadBase(helper, parent)
{
}
void ErrorLogThread::handleLog(const QString& message)
{qDebug() << "ERROR: " << message;m_logHelper->logMessage("ERROR: " + message);
}
9. 日志记录实现类
cpp复制代码#ifndef SIMPLELOGHELPER_H
#define SIMPLELOGHELPER_H
#include "loghelperinterface.h"
#include <QDebug>
class SimpleLogHelper : public LogHelperInterface
{
public:void logMessage(const QString& message) override{// 这里我们简单将日志输出到控制台qDebug() << "Logging message: " << message;}
};
#endif // SIMPLELOGHELPER_H
10. 主函数示例
cpp复制代码#include <QCoreApplication>
#include "logengine.h"
#include "simpleloghelper.h"
#include "logthreadbase.h"
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);
SimpleLogHelper logHelper;
// 创建日志引擎LogEngine* logEngine = new LogEngine(1, &logHelper);
// 生成不同的日志处理线程LogThreadBase* infoLogThread = LogThreadBase::createLogHandler("info", &logHelper);LogThreadBase* warningLogThread = LogThreadBase::createLogHandler("warning", &logHelper);LogThreadBase* errorLogThread = LogThreadBase::createLogHandler("error", &logHelper);
// 处理日志infoLogThread->handleLog("This is an info message");warningLogThread->handleLog("This is a warning message");errorLogThread->handleLog("This is an error message");
return a.exec();
}
总结
-
接口模式:
LogHelperInterface是接口,SimpleLogHelper实现了这个接口,用于处理日志输出。 -
工厂模式:
LogThreadBase::createLogHandler工厂方法根据传入的日志类型动态生成不同的日志处理线程(如InfoLogThread,WarningLogThread,ErrorLogThread)。 -
模板方法模式:
LogThreadBase作为抽象基类,定义了日志处理的通用接口,具体实现由子类完成。
通过这个示例,展示了如何使用这些设计模式来构建一个灵活、可扩展的系统。
相关文章:
一个使用接口模式、工厂模式、模板方法模式的日志文件系统
引言: 编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式: 接口模式(Interface Pattern):定义接口类,并让具体实现类去实现该接口的功能。 工厂模式(Factory Pa…...
openjdk17 C++源码是怎么给java字段赋值的
##java源码 public class OtherClass {public static int CONSTANT_O9876;public int o1234;public void dddd(){String dddd "dddd";//System.out.println(dddd);System.out.println(ddddCONSTANT_O);}} public int o1234; 在openjdk17中 C源码怎么执行这段代码…...
C++初阶(八)--内存管理
目录 引入: 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数(重要点进行讲解) …...
C# 企业微信机器人推送消息 windows服务应用程序的使用
C# 企业微信机器人推送消息 先添加一个机器人! 然后查看机器人就可以得到一个 webhook 特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏! 然后开始写代码 ,只需要httpPost 调用一下这个地址就可以发送消息了。 首先我…...
社区交流系统设计与实现
社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序,旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复,以及管理个人资料,提高用户之间的互动和信息共享…...
【模型学习之路】手写+分析bert
手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前,建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…...
Redis学习文档(常见面试题)
目录 Redis回收使用的是什么算法? Redis如何做大量数据插入? 为什么要做Redis分区? 你知道有哪些Redis分区实现方案? Redis分区有什么缺点? Redis持久化数据和缓存怎么做扩容? 分布式Redis是前期做还…...
【C++刷题】力扣-#594-最长和谐子序列
题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的 子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变…...
MoveIt 控制自己的真实机械臂【2】——编写 action server 端代码
完成了 MoveIt 这边 action client 的基本配置,MoveIt 理论上可以将规划好的 trajectory 以 action 的形式发布出来了,浅浅尝试一下,在 terminal 中运行 roslaunch xmate7_moveit_config_new demo.launch 报错提示他在等待 xmate_arm_control…...
C#制作学生管理系统
定义学生类 定义一个简单的类来表示学生,包括学号、姓名、性别、年龄、电话、地址。再给其添加一个方法利于后续添加方法查看学生信息。 //定义学生类 public class student {public int ID { get; set; }//开放读写权限public string Name { get; set; }public i…...
python Pandas合并(单元格、sheet、excel )
安装 Pandas 和 openpyxl 首先,确保已经安装了 Pandas 和 openpyxl。可以通过 pip 安装: pip install pandas openpyxl 创建 DataFrame import pandas as pd # 创建 DataFrame df1 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [25, 30, 35]…...
OJ在线编程常见输入输出练习【JavaScript】
(注:本文是对【JavaScript Node 】 ACM模式,常见输入输出练习相关内容的介绍!!!) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 一、ACM模式下的编辑页面 二、ACM模式下&a…...
新能源汽车空调系统:绿色出行的舒适保障
在新能源汽车迅速发展的今天,空调系统作为提升驾乘舒适度的重要组成部分,发挥着不可或缺的作用。新能源汽车空调系统主要由压缩机、冷凝器、节流装置和蒸发器四大件组成,它们协同工作,为车内提供适宜的温度和湿度环境。 一、压缩…...
Date工具类详细汇总-Date日期相关方法
# 1024程序员节 | 征文 # 目录 简介 Date工具类单元测试 Date工具类 简介 本文章是个人总结实际工作中常用到的Date工具类,主要包含Java-jdk8以下版本的Date相关使用方法,可以方便的在工作中灵活的应用,在个人工作期间频繁使用这些时间的格…...
TMUX1308PWR规格书 数据手册 具有注入电流控制功能的 5V 双向 8:1单通道和 4:1 双通道多路复用器芯片
TMUX1308 和 TMUX1309 为通用互补金属氧化物半导体 (CMOS) 多路复用器 (MUX)。TMUX1308 是 8:1单通道(单端)多路复用器,而 TMUX1309 是 4:1 双通道(差分)多路复用器。这些器件可在源极 (Sx) 和漏极 (Dx) 引脚上支持从 …...
证件照怎么换底色?简单又快速!不看后悔
一、引言 证件照在我们的生活中有着广泛的应用,无论是求职、考试还是办理各种证件,都需要用到不同底色的证件照。传统的换底色方法往往比较复杂,需要一定的专业技能和软件操作经验。但是现在,有了更简单快捷的方法,让你…...
Rust 基础语法与常用特性
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型,主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值,Rust 中…...
一、开发环境的搭建
环境搭建步骤: 下载软件安装软件运行软件 其他: Visual studio 安装包文件:https://www.alipan.com/s/nd5RgzD4e3b 下载软件 在浏览器中搜索Visual studio,选择如图的选项 点击该区域,进入该页面,【或…...
Docker:存储原理
Docker:存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层,轻量且高效的文件系统。其将整个文件系统分为多个层,层与层之间进行覆盖&#x…...
ts:数组的常用方法(push、pop、shift、unshift、splice、slice)
前端css中filter的使用 一、主要内容说明二、例子(一)、push方法(尾添加)1.源码1 (push方法)2.源码1运行效果 (二)、pop方法(尾删除)1.源码2(pop方…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
