【二】【设计模式】建造者模式
建造者模式的引入
//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制表符) 一)块级标签…...
C语言内存函数(超详解)
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…...
2024年天津体育学院退役大学生士兵专升本专业考试报名安排
天津体育学院2024年退役大学生士兵免试专升本招生专业考试报名安排 一、报名安排 1.报名对象:免于参加天津市文化考试的退役大学生士兵(已参加天津市统一报名且资格审核通过) 2.报名时间:2024年4月4日9:00-4月5日17…...
linux bypy 定时备份到百度网盘
安装 # 先卸载安装的python-pip sudo yum remove python-pip# 下载get-pip.py文件 wget https://bootstrap.pypa.io/pip/2.7/get-pip.py sudo python get-pip.py直接访问这个地址下载文件,再导入linux更快! https://bootstrap.pypa.io/pip/2.7/get-pip.py 连接 复制上面的连…...
星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)
之前写了个1.0版本,由于太局限,需要用到笔记本才能操作,很多车友反馈不方便。特此出个手机版教程,简单easy,妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app,这步很关…...
Spring Web MVC的入门学习(一)
目录 一、什么是 Spring Web MVC 1、MVC 定义 二、学习Spring MVC 1、项目准备 2、建立连接 2.1 RequestMapping 注解的学习 2.2 RequestMapping 使用 3、请求 3.1 传递单个参数 3.2 传递多个参数 3.3 传递对象 3.4 后端参数重命名(后端参数映射…...
如何使用Java语言发票查验接口实现发票真伪查验、票据ocr
随着时代潮流的发展,企业也在寻找更加便捷、高效的办公模式,尤其是针对财务工作人员而言,繁琐的发票录入、查验工作占据了财务人员的大部分时间。对此,翔云提供了发票识别接口、发票查验接口,那么企业应当如何将这些接…...
CAPL实现关闭TCP连接的几种方式以及它们的区别
在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…...
Git--08--Git分支合并操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端:GitExtensions操作步骤:A操作步骤:B操作步骤:C操作步骤:D操作步骤&#…...
深度学习训练中的种子设置
文章目录 深度学习训练中的种子设置1. 为什么需要设置随机种子2. 随机种子的设置及使用 深度学习训练中的种子设置 1. 为什么需要设置随机种子 在神经网络训练过程中,经常会通过随机的方式对一些数据进行初始化: 1、随机权重,网络有些部分…...
LLM:函数调用(Function Calling)
1 函数调用 虽然大模型能解决很多问题,但大模型并不能知晓一切。比如,大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月,GPT-4 是 2023 年12月)。另外,大模型没有“真逻辑”。它表现出的逻辑、推理,是训练文本的统计…...
河北网站建设seo优化制作设计/广州网站运营
案例三:验证码 需求: 实现随机产生一个5位的验证码,每位可能是数字、大写字母、小写字母 分析: 定义一个生成验证码的方法verifyCode,方法参数是位数、方法的返回值类型是String在方法内部使用循环生成指定位数的随机…...
微云怎么做网站/游戏推广公司怎么接游戏的
(1,2,2) >> pie(x,explode1) 5.3.4 不同坐标系中的绘图 Semilogx,semilogy,loglo,polar(theta,rho)的使用方法和 plot 完全类似, 不同的只是绘 制到 ......(见表 5.3.1)表 5.3.1 其他图形函数表 函数含义 loglog 使用对数坐标系绘图 semilogx 横坐标为对数坐标轴,纵坐标为…...
vue做单页面网站/sem推广计划
作者:川石信息 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 从被测试对象的角度分类,测试方法可以分为黑盒测试、白盒测试、灰盒测试三种,这也是我们最常看到的分类方法。 任何一个程序在测试时都由这…...
前端开发比较好的公司/上海seo推广
.net2005数据库连接字符串<connectionStrings> <remove name"LocalSqlServer"/> <add name"Connection String" connectionString"server服务器地址;Initial Catalog数据库名;User ID用户名;Password密码" providerName&…...
重庆做网站人才/下载百度网盘app最新版
2019独角兽企业重金招聘Python工程师标准>>> 本机生成rsa公钥和私钥(如果需要) $ ssh-keygen -t rsa -C "YOUR_EMAILxxx.COM"会在 .ssh目录下生成秘钥对文件 id_rsa,id_rsa.pub 上传公钥到服务器 $ scp -p ~/.ssh/id_rsa.pub root192.168.0.1:/root/.ssh/…...
深圳网站制作首选灵点网络/网络营销成功案例
关于图片或者文件在数据库的存储方式归纳 商品图片,用户上传的头像,其他方面的图片。目前业界存储图片有两种做法: 1、 把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。ora…...