【二】【设计模式】建造者模式
建造者模式的引入
//C10_1.cpp
#include <stdio.h>#include "SystemConfig.h"int main() {SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config2("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","", "", "","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config3("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw","", "", "");return 0;
}
在C10_1.cpp
中,首先包含了SystemConfig.h
头文件以访问SystemConfig
类。然后在main
函数中,创建了三个SystemConfig
对象,每个对象都用不同的参数初始化。这三个对象分别为config
、config2
和config3
,它们代表不同的配置集。每个对象的构造函数都传入了MySQL、Redis和Kafka的URL、用户名和密码。在config2
和config3
中,某些服务的参数为空字符串,表示不使用该服务。
//SystemConfig.h
#pragma once#include <string>class SystemConfig
{
public:SystemConfig(const std::string & _MySQL_URL, const std::string & _MySQL_USER, const std::string & _MySQL_PW,const std::string & _Redis_URL, const std::string & _Redis_USER, const std::string & _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);std::string MySQL_URL;std::string MySQL_USER;std::string MySQL_PW;std::string Redis_URL;std::string Redis_USER;std::string Redis_PW;std::string Kafka_URL;std::string Kafka_USER;std::string Kafka_PW;
};
SystemConfig.h
是SystemConfig
类的头文件。它声明了SystemConfig
类及其构造函数和成员变量。构造函数接受MySQL、Redis和Kafka的URL、用户名和密码作为参数。这些参数被用来初始化对象的公共成员变量。使用#pragma once
防止头文件被多次包含。
//SystemConfig.cpp
#include "SystemConfig.h"SystemConfig::SystemConfig(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW,const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{MySQL_URL = _MySQL_URL;MySQL_USER = _MySQL_USER;MySQL_PW = _MySQL_PW;Redis_USER = _Redis_USER;Redis_URL = _Redis_URL;Redis_PW = _Redis_PW;Kafka_USER = _Kafka_USER;Kafka_URL = _Kafka_URL;Kafka_PW = _Kafka_PW;
}
SystemConfig.cpp
是SystemConfig
类的源文件。它定义了SystemConfig
类构造函数内部的代码逻辑,利用接受的MySQL、Redis和Kafka的URL、用户名和密码的参数,对应的赋值给SystemConfig
类的成员变量。
建造者模式
//C10_2.cpp
#include <stdio.h>#include "SystemConfig.h"#include "SystemConfigBuilder.h"#include "CompanyA.h"
#include "CompanyB.h"int main()
{/*SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw","kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config2;config2.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");config2.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");config2.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");*/SystemConfigBuilder builder; builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");builder.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");SystemConfig config = builder.getSystemConfig();printf("Mysql URL: %s\n", config.MySQL_URL.c_str());printf("Mysql USER: %s\n", config.MySQL_USER.c_str());printf("Mysql PW %s\n", config.MySQL_PW.c_str());printf("Redis URL: %s\n", config.Redis_URL.c_str());printf("Redis USER: %s\n", config.Redis_USER.c_str());printf("Redis PW %s\n", config.Redis_PW.c_str());printf("Kafka URL: %s\n", config.Kafka_URL.c_str());printf("Kafka USER: %s\n", config.Kafka_USER.c_str());printf("Kafka PW %s\n", config.Kafka_PW.c_str());CompanyA companyA;SystemConfig configA = companyA.buildSystemConfig();CompanyB companyB;SystemConfig configB = companyB.buildSystemConfig();return 0;
}
//SystemConfig.h
#pragma once#include <string>class SystemConfig
{
public:SystemConfig();SystemConfig(const std::string & _MySQL_URL, const std::string & _MySQL_USER, const std::string & _MySQL_PW,const std::string & _Redis_URL, const std::string & _Redis_USER, const std::string & _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);std::string MySQL_URL;std::string MySQL_USER;std::string MySQL_PW;std::string Redis_URL;std::string Redis_USER;std::string Redis_PW;std::string Kafka_URL;std::string Kafka_USER;std::string Kafka_PW;
};
SystemConfig.h
是SystemConfig
类的头文件。它声明了SystemConfig
类及其构造函数和成员变量。构造函数接受MySQL、Redis和Kafka的URL、用户名和密码作为参数。这些参数被用来初始化对象的公共成员变量。使用#pragma once
防止头文件被多次包含。与之前的代码一致,没有发生改变。
//SystemConfig.cpp
#include "SystemConfig.h"SystemConfig::SystemConfig()
{}SystemConfig::SystemConfig(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW,const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW,const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{MySQL_URL = _MySQL_USER;MySQL_USER = _MySQL_URL;MySQL_PW = _MySQL_PW;Redis_USER = _Redis_USER;Redis_URL = _Redis_URL;Redis_PW = _Redis_PW;Kafka_USER = _Kafka_USER;Kafka_URL = _Kafka_URL;Kafka_PW = _Kafka_PW;
}
SystemConfig.cpp
是SystemConfig
类的源文件。它定义了SystemConfig
类构造函数内部的代码逻辑,利用接受的MySQL、Redis和Kafka的URL、用户名和密码的参数,对应的赋值给SystemConfig
类的成员变量。
//SystemConfigBuilder.h
#pragma once#include "SystemConfig.h"class SystemConfigBuilder
{
public:SystemConfig config;int setMySQL(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW);int setRedis(const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW);int setKafka(const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW);SystemConfig& getSystemConfig();
};
SystemConfigBuilder.h
是SystemConfigBuilder
类的头文件,声明了SystemConfig
类成员变量,以及setMySQL
、setRedis
、setKafka
,三个成员函数,分别用来配置MySQL
、Redis
、Kafka
。以及getSystemConfig
成员函数用来获取对应的SystemConfig
类系统配置。
//SystemConfigBuilder.cpp
#include "SystemConfigBuilder.h"SystemConfig& SystemConfigBuilder::getSystemConfig()
{return config;
}int SystemConfigBuilder::setMySQL(const std::string& _MySQL_URL, const std::string& _MySQL_USER, const std::string& _MySQL_PW)
{config.MySQL_URL = _MySQL_USER;config.MySQL_USER = _MySQL_URL;config.MySQL_PW = _MySQL_PW;return 0;
}int SystemConfigBuilder::setRedis(const std::string& _Redis_URL, const std::string& _Redis_USER, const std::string& _Redis_PW)
{config.Redis_USER = _Redis_USER;config.Redis_URL = _Redis_URL;config.Redis_PW = _Redis_PW;return 0;
}int SystemConfigBuilder::setKafka(const std::string& _Kafka_URL, const std::string& _Kafka_USER, const std::string& _Kafka_PW)
{config.Kafka_USER = _Kafka_USER;config.Kafka_URL = _Kafka_URL;config.Kafka_PW = _Kafka_PW;return 0;
}
SystemConfigBuilder.cpp
是SystemConfigBuilder
类的源文件,对SystemConfigBuilder.h
中的声明进行了定义。
//Director.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"class Director
{
public:SystemConfigBuilder builder;virtual SystemConfig& buildSystemConfig() = 0;
};
Director.h
是Director
导演类的头文件,我们利用SystemConfigBuilder
类可以很方便地完成系统的配置,但对于不同的公司他们提供的服务不同,有些公司只需要配置MySQL
和Kafka
,有些公司只配置MySQL
和Redis
。对于不同的公司运用SystemConfigBuilder
类的情况不同,因此我们为不同的公司准备不同的调用方案,到时候只需要使用一个函数就可以完成配置。将调用函数配置行为进行封装。
Director
的目的是为了封装控制SystemConfigBuilder
类,因此构造一个纯虚函数buildSystemConfig
,用来表示不同公司对于SystemConfigBuilder
的使用情况。
//Director.cpp
#include "Director.h"
//CompanyA.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"#include "Director.h"class CompanyA : public Director
{
public:virtual SystemConfig & buildSystemConfig() override;
};
//CompanyA.cpp
#include "CompanyA.h"SystemConfig& CompanyA::buildSystemConfig()
{builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("", "", "");builder.setKafka("kafka://127.0.0.1", "xiaomukafka", "xiaomukafkapw");return builder.getSystemConfig();
}
CompanyA
公司只配置MySQL
和Kafka
,因此buildSystemConfig
函数调用setRedis
参数为空。
//CompanyB.h
#pragma once#include "SystemConfig.h"
#include "SystemConfigBuilder.h"#include "Director.h"class CompanyB : public Director
{
public:virtual SystemConfig& buildSystemConfig() override;
};
//CompanyB.cpp
#include "CompanyB.h"SystemConfig& CompanyB::buildSystemConfig()
{builder.setMySQL("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda");builder.setRedis("redis://127.0.0.1/", "xiaomuredis", "xiaomuredispw");builder.setKafka("", "", "");return builder.getSystemConfig();
}
CompanyB
公司只配置MySQL
和Redis
,因此buildSystemConfig
函数调用setKafka
参数为空。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!
相关文章:
【二】【设计模式】建造者模式
建造者模式的引入 //C10_1.cpp #include <stdio.h>#include "SystemConfig.h"int main() {SystemConfig config("mysql://127.0.0.1/", "xiaomu", "xiaomumemeda","redis://127.0.0.1/", "xiaomuredis", &q…...

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤
集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…...
【Python】python+requests+excel+pytest-实现接口自动化实例
目录 测试需求实现思路完整框架2.1 初始化数据 (test_data.xlsx)2.2 核心脚本 (api_client.py)2.3 测试用例 (test_interfaces.py)2.4 日志 (logging)2.5 pytest配置文件 (pytest.ini)2.6 测试报告 (pytest-html)2.7 入口函数 (run_tests.py)2.8 完整流程注意事项测试需求 简单…...
Django(四)-搭建第一个应用(3)
一、问题详情页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>展示某个投票的问题和不带结果的选项列表</title> </head> <body><form action"{% url polls:vote questi…...

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践
问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度?导数项的含义为什么要控制梯度下降的方向?梯度下降何时结束?梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…...

SQL,group by分组后分别计算组内不同值的数量
SQL,group by分组后分别计算组内不同值的数量 如现有一张购物表shopping 先要求小明和小红分别买了多少笔和多少橡皮,形成以下格式 SELECT name,COUNT(*) FROM shopping GROUP BY name;SELECT name AS 姓名,SUM( CASE WHEN cargo 笔 THEN 1 ELSE 0 END)…...
关于python中常用命令(持续更新中)
目录 关于pip 卸载安装pip 更新pip 更换pip镜像源 清除缓存 更新指定包 指定清华镜像下载指定包 关于conda 更换清华镜像源 优先使用清华镜像 清除缓存 关于数据分析、数据挖掘常用 Matplotlib 3.6.0 文档(绘图实例) jupyter字体问题 jup…...

JAVA学习笔记21
1.IDEA的使用 1.ctrl B 快速定位到方法 2.ctrl Y 快速删除行 3.ctrl D 快速复制行 4.ctrl H 查看继承的层级关系 5.快速格式化代码 ctrl shift L 6.alt R 快速允许程序 7.ctrl / 快速添加注释 1.包(软件包) 1.1包的三大作用 1.区分相同名字的类 2.当类很多的…...

如何制作Word模板并用Java导出自定义的内容
1前言 在做项目时会按照指定模板导出word文档,本文讲解分析需求后,制作word模板、修改模板内容,最终通过Java代码实现按照模板自定义内容的导出。 2制作word模板 2.1 新建word文档 新建word文档,根据需求进行编写模板内容,调整行间距和段落格式后将指定替换位置留空。…...
ubuntu 安装配置samba服务器完整教程
ubuntu 安装配置samba服务器完整教程 问题描述解决方法郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Intel arm64 OS:ubuntu16.04 问题描述 在安卓驱动系统开发的过程中,会需要搭建服务器,又需要搭建samba服务器,下面就…...

【APP_TYC】数据采集案例天眼APP查_查壳脱壳反编译_③
是不是生活太艰难 还是活色生香 我们都遍体鳞伤 也慢慢坏了心肠 你得到你想要的吗 换来的是铁石心肠 可曾还有什么人 再让你幻想 🎵 朴树《清白之年》 查壳 工具介绍Frida-dexDump Frida-dexDump简介 Frida-dexDump是基于Frida的一个工具&…...

通过MobaXterm工具可视化服务器桌面
一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具,可以连接到各种类型的服务器,包括Linux、Windows和MacOS。支持多种协议,包括SSH、RDP、VNC和Telnet MobaXterm可以通过X11转发功能可视化服务器桌面。 二、MobaXterm工具可视化服务…...

ctf题目
目录 1.文件包含的一道题目,没什么难度, 2.一道sql注入的题目,伪静态 3.限制只能本地访问。 1.文件包含的一道题目,没什么难度, 但是一个点就是它这里去包含的那个文件名就是flag,而不是flag.php也不是f…...
git 更改仓库地址
背景: 项目本来在A仓库进行保管,研发已经开发一段时间了,现在切换到了新的仓库B,研发本地如何将仓库切换到B 解决: # 查看远端地址 git remote -v # 查看远端仓库名 git remote # 重新设置远程仓库 git remote s…...

GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。
demo案例 GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。下面我将逐个讲解其入参、出参、属性、方法以及API使用方式。 入参(Input Parameters): GLTFExporter的主要入参是要导出的场景对象和一些导出选项。具体来说: s…...

消息队列经典应用场景
笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…...

阿里云Salesforce CRM功能差异列表 - Winter‘24
阉割版的阿里云Salesforce由于技术和监管等因素与国际版的Salesforce差距很大! 一、Winter‘ 24版差异概况: 1.1. 主要版本: 阿里云上的 Salesforce 提供两个版本,用于生产用途的 CN 版本(CN Edition)和用…...

WIN10系统下误删除了用户重启无法登录
WIN10系统下误删除了用户重启无法登录 不小心在控制面板的用户组里面删除了当前的用户,在电脑重启后无论怎么输入密码都提示不正确不能登录。 在选择登录的界面同时点击 shift 和重启按钮;在进入的界面选择“疑难问题”;选择进入安全模式&…...

国内ip怎么来回切换:操作指南与注意事项
在数字化时代,互联网已经成为我们日常生活、学习和工作中不可或缺的一部分。然而,随着网络应用的不断深化,用户对于网络环境的稳定性和安全性要求也越来越高。其中,IP地址作为网络中的关键标识,其切换与管理显得尤为重…...

day72Html
常用标签: 分类: 块级标签:独立成行 行级标签:不独立成行,同一行可放多个行级标 注意网页显示时,忽略空白字符,(回车符,空格,tab制表符) 一)块级标签…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...