一个使用接口模式、工厂模式、模板方法模式的日志文件系统
引言:
编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式:
-
接口模式(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方…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...