设计模式&框架工具
文章平均质量分 53
1、设计模式个人学习笔记
2、个人编写的框架工具集
3、对应github仓链接:https://github.com/ZhiyuZhang1994/my_tool_repo
持续学习,不断沉淀
C++开发工程师
展开
-
C++打点计时器工具
开发了打点计时器工具,使用简单,时间统计直观。原创 2023-05-31 18:27:25 · 1265 阅读 · 1 评论 -
软件设计原则:迪米特法则
迪米特法则要求一个对象应该对其他对象有最少的了解,所以又叫做最少知识原则。原创 2023-05-10 15:54:52 · 156 阅读 · 0 评论 -
单一职责原则
单一职责原则,指一个类或者模块不要存在多于一个导致变更的原因。原创 2023-04-24 18:13:05 · 243 阅读 · 0 评论 -
C++序列化方案选型及boost序列化使用方法
MFC和.Net框架的方法适用范围很窄,只适用于Windows下,且.Net框架方法还需要.Net的运行环境。Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。使用灵活简单,而且支持标准C++容器。MFC的效率较低,但是结合MSVS平台使用最为方便。开源方案适配数据类型少。原创 2022-09-08 18:09:02 · 949 阅读 · 0 评论 -
观察者机制————利用回调函数实现
一、介绍:此工具实现了观察者机制(同进程内交互)。此工具的优势:1、客户不需要针对客户特性实现观察者、通知者类,是一个即拿即用的工具;2、观察者与通知者相互解耦。当前缺陷:1、未加锁,不保证线程安全;2、消息内容固定为int,未扩展:制约了回调函数与通知函数;3、未考虑性能问题,只是玩具级工具;4、未实现解观察detach()与释放主题release()两函数;以上缺陷只是待补充部分代码,不影响整个观察者机制的设计思想,待空了再修正。原创 2022-05-04 18:35:15 · 556 阅读 · 0 评论 -
一行宏定义使一个类变为单例类
一、介绍:编写一个单例框架,使得最终通过一行宏定义,将一个类变为单例类。减少客户侧定义单例类时编写重复代码。二、代码:2.1、单例框架代码:// Singleton.h// description: 单例框架模板// author: XXX// date: XXX#ifndef INCLUDE_TOOLS_SINGLETON#define INCLUDE_TOOLS_SINGLETON#include <iostream>#include <atomic>原创 2022-05-03 16:53:30 · 650 阅读 · 0 评论 -
C++获取、打印当前时间:time、localtime
总结:1、函数1为基本的获取time_t格式时间函数;2、函数3、4为转换为tm格式时间函数;3、函数2、5、6为输出可读格式时间函数。4、其中函数2、5不符合使用习惯,因此不长使用,常用函数6定制化输出。以下函数全部在#include <ctime>中。1、time_t time(time_t *seconds):函数描述:返回基于当前系统的自纪元起经过的时间,以秒为单位。参数/返回值: seconds,存储获取的时间。使用:time_t now = time(nullpt原创 2021-04-06 22:06:03 · 18695 阅读 · 0 评论 -
C++日志记录函数:包含时间与文件信息
1、代码示例:#include <iostream> #include <ctime> using namespace std; // 打印当前的时间信息 void static print_curr_time() { time_t now = time(nullptr); tm* curr_tm = localtime(&now); static char time[80] = {0}; strftime(time, 80, "%原创 2021-04-09 22:16:11 · 798 阅读 · 0 评论 -
C++性能优化方法
1、map改用unordered_map:搜索操作在数据量大时会有效缩短耗时2、const对象传递使用引用:减少复制构造耗时3、vector改用map、set代替:搜索、增删操作会大大缩短耗时4、多次调用函数(如巡检函数)中的vector、list等局部遍历,改成成员遍历:减少构造析构次数,也会大大缩短代码耗时...原创 2021-08-15 17:31:12 · 923 阅读 · 0 评论 -
组合模式及其变种(桥接模式、状态模式和策略模式)
1、组合模式:一个类包含很多类的实例,作为这些类对象的调用入口。将工作委派给这些对象执行,他处理结果并返回。2、桥接模式、 状态模式和策略模式:桥接模式、 状态模式和策略模式(在某种程度上包括适配器模式、模板方法模式)的接口非常相似。 实际上, 它们都基于组合模式——即将工作委派给其他对象,不过也各自解决了不同的问题。 模式并不只是以特定方式组织代码的配方, 你还可以使用它们来和其他开发者讨论模式所解决的问题。3、模板方法模式与策略模式对比:1、模板方法模式基于继承机制: 它允许你通过扩展子类中的原创 2021-05-26 21:31:17 · 805 阅读 · 0 评论 -
yaml配置文件应用
1、配置文件: 对不同对象应用不同配置的文件。2、配置文件两种使用方式:2.1、编辑时读取: 在编译前,读取yaml文件输出成cpp文件,参与编译,软件运行中作为内存变量使用。优点: 访问内存,读取速度快;发布件不含配置文件,不易被篡改。缺点: 常写成静态变量,占用内存;同时运行时不可修改。实现步骤:1、编写yaml配置文件:https://www.runoob.com/w3cnote/yaml-intro.html2、Cmake脚本中调用python解释器,解析配置文件输出cpp原创 2021-05-24 21:40:05 · 429 阅读 · 0 评论 -
设计模式-->行为模式-->模板方法模式
1、思想:模板方法模式建议将算法分解为一系列步骤,然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。即用基类定义一个算法的骨架(一个操作的一系列步骤),而将一些不确定的步骤延迟到子类实现,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2、真是世界类比:3、运用模板方法前后对比:// 使用模板方法前: void algorithm(Para para) { step1(); step2(); if (para == p原创 2021-04-21 21:45:39 · 71 阅读 · 0 评论 -
C++中table_driven实现:降低圈复杂度
1、实现代码: ==关注头文件 ==// table_map.h #ifndef TABLE_MAP_H #define TABLE_MAP_H #include <iostream>#include <map> #include <utility> #include <initializer_list> #include <functional> using namespace std; template &原创 2021-04-09 22:23:34 · 457 阅读 · 0 评论 -
设计模式:行为模式->责任链模式
1、责任链模式:是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。真实世界例子:在线订购系统中,对于客户发起请求进行的–>身份认证–>订购数据验证–>重复下单验证–>结算–>订购成功等流成作为责任连,让请求在链上移动。个人理解:像工作中的命令处理流程:命令下发–>数据处理层–>逻辑处理层–>驱动处理层–>硬件处理层,在各层中都有自己的校验,自己处理完则把消息传给下一级原创 2021-04-06 22:08:34 · 118 阅读 · 0 评论 -
设计模式:结构型模式->桥接模式
1、桥接模式:桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。2、应用:修改前:修改后:我们可以将颜色相关的代码抽取到拥有 红色和 蓝色 两个子类的颜色类中, 然后在 形状类中添加一个指向某一颜色对象的引用成员变量。 现在, 形状类可以将所有与颜色相关的工作委派给连入的颜色对象。 这样的引用就成为了 形状和 颜色之间的桥梁。 此后, 新增颜色将不再需要修改形状的类层次, 反之亦然。个人理解: 利用组合。参考资料:原创 2021-03-31 21:08:25 · 116 阅读 · 0 评论 -
设计模式->行为模式:中介者模式
1、中介者模式:中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。真实世界例子: 飞行器驾驶员之间不会通过相互沟通来决定下一架降落的飞机。 所有沟通都通过控制塔台进行。2.1、中介者模式结构:组件(Component):各种包含业务逻辑的类。每个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件不知道中介者实际所属的类,因此你可通过将其连接到不同的中介者以使其能在其他程序中复用。中介者(M原创 2021-03-07 18:03:42 · 152 阅读 · 0 评论 -
设计模式->结构型模式:外观模式
1、外观模式:外观模式: 亦称为门面模式、Facade,是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。真实世界例子: 当你通过电话给商店下达订单时,接线员就是该商店的所有服务和部门的外观。接线员为你提供了一个同购物系统、支付网关和各种送货服务进行互动的简单语音接口。 直白理解: 通过在客户端(客户是相对的)代码与复杂的交互系统(第三方库、框架机制等)之间创建一个外观接口(类/函数),确保所有客户端代码仅通过外观来与复杂系统进行交互,从而让自己的代码独立于复杂系统。原创 2021-03-07 17:57:11 · 79 阅读 · 0 评论 -
生产者消费者模式及条件变量
1、基础概念:1.1、什么是生产者-消费者模式?比如有两个线程A和B,它们共享一个固定大小的数组,A线程产生数据放入数组,B线程从数组中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相当于消费者。1.2、为什么要使用生产者消费者模式?在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完了数据才能够继续生产数据,因为生产那么多也没有地方放啊;同理如果消费者的速度大于生产者那么消费者就会经常处理等待状态,所以为了达原创 2021-02-07 22:10:31 · 603 阅读 · 0 评论 -
静态构造单例、动态构造(带垃圾回收)单例和多件
1、单例模式:构造函数私有,通过static的接口函数向外提供单例的访问。2、单例模式的不同实现方式:2.1、动态构造单例,垃圾回收析构:class Singleton { public: static Singleton* GetInstance() { if (m_Instance == nullptr) { // 判断是否第一次调用 m_Instance = new Singleton(); }原创 2021-02-07 21:50:47 · 186 阅读 · 0 评论 -
工厂方法模式
工厂是一个含义模糊的术语,表示可以创建一些东西的函数、方法或类。最常见的情况下,工厂创建的是对象。工厂方法是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。个人理解:基类中声明一个虚函数(工厂方法:返回对象的方法),不同派生类重写该工厂方法实现不同功能(创建不同对象)。即同一个工厂(基类工厂方法)可以产生不同对象。完全使用了继承的特性。#include <iostream> #include <string> using namespac原创 2020-12-20 15:59:45 · 105 阅读 · 0 评论 -
观察者模式理解及实例
实例:#include <iostream>#include <list>#include <string>#include <vector>// 观察者基类,提供供发布者调用的通用接口Update()函数;class IObserver {public: virtual ~IObserver() {}; virtual void Update(const std::string &message) = 0;};// 发布者基原创 2020-12-13 23:34:33 · 866 阅读 · 0 评论