设计模式的C++实现(4)——迭代器Iterator
模式名称: 迭代器-Iterator类型: 行为模式问题-使用场景: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示解决方案: 将对列表(对象集合)的访问和遍历从具体对象中分离出来,并放入一个迭代器对象中,由它负责实现访问和遍历功能效果: 提供了统一的遍历成员的方法,降低了用户的使用难度,提高了代码的封装性和可扩展性。代价是增加了代码复杂性,增加了更多的类,提高了代码的设计难度
注:本文的迭代器风格更偏向STL库中的迭代器,而不是《设计模式》中的抽象迭代器
灵感来源:某种意义上将,Iterator要做的事就是模仿数组中的指针,指针可以前后移动,方便地遍历数组,还可以用指针访问数组元素。我们希望把这种指针特性也用在其它数据结构上(特指组织管理多个对象的聚合体),但可惜的是原生指针的这种方便依赖于数组的地址是连续的。因此为了实现遍历和访问功能,我们需要把这些功能封装在Iterator类中,让它实例化出的对象来行使数组指针一样的行为。
类层次设计我们先来设计一个抽象迭代器类来规定迭代器应有哪些行为:
12345678910111213141516171819 ...
设计模式的C++实现(0)——初识设计模式
《设计模式的C++实现》为作者对系列博客的又一次尝试:在开发过C++基于多设计模式下的同步&异步⽇志系统🔗后,作者接触到了《设计模式》这本书,颇有感触,于是决定写博客来记录读后的灵感,然而随着博客内容的不断丰富,单篇的博客已经承载不下如此多样的内容,各种各样的设计模式便是一个典例,所以我决定将设计模式相关的博客拆成一个系列博客
目录:TODO
知识基础本系列博客着重于经典设计模式的介绍和运用C++类和对象技术将其实现,所以要求读者已经能够熟练掌握C++类和对象技术。并且当我们提及抽象类,多态,或者继承,虚函数的声明与实现等概念时,你应当已经对这些概念了然于心,而不是一知半解,还要查资料复习
设计模式从何而来设计模式描述了在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。设计模式捕获了随时间进化与发展的问题的求解方法,因此它们往往并不是人们从一开始就采用的设计方案,它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的艰苦努力。设计模式所做的事,就是捕获这些解决方案,并用简洁易用的方式表达出来。
学习目标设 ...
【代码整理】同步&异步⽇志系统的代码复盘
在项目的介绍博客🔗中,我们着重于代码功能的实现,而对项目代码整体的结构和风格欠缺重视,使其可读性有所欠缺,代码规范性也有所不足。所以在这篇博客中,我们将按上篇博客编写代码的顺序,再一次回顾写好的代码,并着重于:
调整代码结构
增加必要注释,删除冗余注释
添加必要的小括号,突出优先级
将代码的简便写法改写回易读的写法
实用类
增加功能简介
增加注释
增加空行12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#pragma once#include <iostream>#include <fstream>#include <sstream>#include <string>#include <ctime>#include <cassert>#include <sys/stat ...
初识Linux套接字(socket)和TCP/UDP协议
这是系列博客中的第二篇,导航如下
初识计算机网络🔗
初识Linux套接字(socket)和TCP/UDP协议🔗 👈您在这里
在Linux环境中,套接字(Socket)是一种用于进程间通信(IPC)的机制,但这里的进程,包括了同一网络下其它主机的进程,所以它被广泛应用于网络编程。它允许不同计算机上的进程或同一计算机上的不同进程之间进行数据交换。
由于此时我们的网络编程基础较少,所以本文的内容更偏向于实践,而不是原理。希望能在动手实践中加深对网络编程的熟悉程度,减少陌生感
在本文中,我们将:
知识铺垫:认识IP地址, 端口号, 网络字节序等网络编程中的基本概念(简略)
socket API学习
实现一个简单的UPD客户端/服务器
实现一个简单的TCP客户端/服务器(服务器包括单连接版本,多进程版本,多线程版本)
知识铺垫理解源IP地址和目的IP地址在数据包的头部中,包含两个IP地址,分别叫做源IP地址和目的IP地址
为什么要有两个IP地址?因为一般通过网络建立的通信都是双向的,而且一方接收请求后,一般还要把响应发送回去,所以含有两个IP地址才 ...
初识Linux编程&初识makefile
前言本文将以实用的视角,以快速上手Linux平台的C++编程为目的,介绍:
Linux的基本操作
gcc/g++的常用指令
makefile的常用编写方式
软件准备如果选择用虚拟机,那请自己解决
这里介绍使用Linux服务器配合本地ssh链接软件的方式在服务器上编写代码
首先是服务器,可以在主流服务器平台(阿里云,腾讯云,华为云)等购买服务器,一般有学生认证会更便宜,服务器配置不限,若要使用Linux,可以选择Ubuntu内核,(CentOs也行,就是太老了,且停止维护了),然后自行查阅相关教程,设置默认管理员账户和密码,以及配置服务器,开启ssh远程链接权限
关于本地的ssh链接软件,这里我只推荐两个我使用过的
xshell7
vscode+ssh插件
其中xshell比较简单,安装好就能用 戳我去下载免费版xshell🔗,怎么登录服务器?自行百度~。但缺点是仅支持控制台,所以写代码只能用vim等支持控制台的文本编辑器
vscode+ssh插件会比xshell麻烦点,还要修改配置文件,具体教程可参考b战视频🔗
但优点是vscode在支持终端(控制台)的同时还支 ...
设计模式的C++实现(2)——代理模式
代理模式
模式名称: 代理模式-Proxy类型: 结构型问题-使用场景: 在执行类和用户间再增加一个中间人,执行类的交互对于用户来说过于复杂,执行类的接口对参数检查较严格等解决方案: 可以封装一个类,为用户提供更简洁的接口,而与执行类的交互在其内部实现;或者封装一个头文件,在里面封装全局函数和宏函数等效果: 增加代码复杂性,封装层数更高,更加抽象。具体实现方式十分多样,增加了代码编写者的工作,但减少了用户的使用难度,也能一定程度上提高安全性
代理模式指代理控制对其他对象的访问, 也就是代理对象控制对原对象的引⽤。在某些情况下,⼀个对象不适合或者不能直接被引⽤访问,⽽代理对象可以在客⼾端和⽬标对象之间起到中介的作⽤。代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象
按照编译时和运行时的行为,代理模式分为静态代理、动态代理:
静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经确定了代理类要代理的是哪个被代理类。
动态代理指的是,在运⾏时才动态⽣成代理类,并将 ...
设计模式的C++实现(1)——单例模式
单例模式介绍
模式名称: 单例模式-Singleton类型: 创建型问题-使用场景: 希望一个类在全局只实例化出一个对象解决方案: 使用静态成员,将构造函数私有化,删除拷贝构造和opetator=()函数效果: 略微增加代码复杂性,使用了静态成员变量/函数。但是能够保证该类只会有一个实例。
⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种⽅式简化了在复杂环境下的配置管理。
单例模式有两种实现模式:饿汉模式和懒汉模式
饿汉模式饿汉模式中,程序启动时就会创建⼀个唯⼀的实例对象。 因为单例对象已经确定, 所以⽐较适⽤于多线程环境中, 多线程获取单例对象不需要加锁, 可以有效的避免资源竞争,⾼性能。
123456789101112131415161718template<typename T>class Singleton ...
设计模式的C++实现(3)——工厂模式与建造者模式
模式名称: 工厂模式-Factory类型: 创建型问题-使用场景: 当创建不同对象的过程过于复杂,或者需要隐藏/封装创建对象的具体过程,或需要创建同一家族的产品(对象)时解决方案:将创建对象的过程封装到工厂类内,并提供设置创建不同对象的接口效果: 简化了用户操作,使创建对象,创建多个不同的对象更为简单易用,提高了代码的封装性。但是代码复杂性大大提高,类封装的层次更多了,可扩展性会有所欠缺。
模式名称: 建造者模式-Builder类型: 创建型问题-使用场景: 当创建不同对象的过程过于复杂,或者需要隐藏/封装创建对象的具体过程,或需要创建同一家族的产品(对象)时解决方案:将创建对象的过程封装到Builder内,并提供设置创建不同对象的接口,以及提供不同的Builder派生类,最后提供一个指挥者类统一指挥对象的创建效果: 可扩展性强的同时,简化了用户操作,使创建对象,创建多个不同的对象更为简单易用,提高了代码的封装性。但是代码复杂性大大提高,类封装的层次更多了。
⼯⼚模式是⼀种创建型设计模式, 它提供了⼀种创建对象的最佳⽅式。在⼯⼚模式中,我们创建对象时不会对上 ...
【版本v1.0】C++基于多设计模式下的同步&异步⽇志系统
前置知识
Linux日志器(简易版)
初识Linux线程
初识设计模式&单例模式&代理模式–设计模式介绍(1)
工厂模式与建造者模式–设计模式介绍(2)
项目介绍背景引入
日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面:
问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。
性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。
安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。
用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。
合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。
系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和自动化处理,从而提高系统的可用性和稳定性。
...
【保持最新】C++基于多设计模式下的同步&异步⽇志系统
当前版本v1.0
前置知识
Linux日志器(简易版)
初识Linux线程
初识设计模式&单例模式&代理模式–设计模式介绍(1)
工厂模式与建造者模式–设计模式介绍(2)
项目介绍背景引入
日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面:
问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。
性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。
安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。
用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。
合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。
系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和自动化处理,从而提高系 ...