自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 设计模式之命令模式

不使用命令模式的坏处方式1:硬编码按钮功能// 问题:按钮功能固定,无法动态改变private:public:// 问题1:每个按钮功能固定// 问题2:无法重新配置按钮// 问题3:添加新设备需要添加新按钮// 问题4:无法实现撤销// 问题5:无法实现宏命令// 问题6:代码重复(每个设备都要类似的方法)方式2:使用if-else判断// 问题:大量的条件判断private:// 按钮到操作的映射public:// 更多的else-if。

2026-03-11 19:23:05 221

原创 设计模式之访问者模式

不使用访问者模式的坏处方式1:在元素类中添加所有功能// 问题:元素类变得臃肿private:public:// 每个功能都在这个类中实现// 处理结果// 处理结果if (!cout << "类名不规范: " << name << endl;

2026-03-11 19:22:32 322

原创 设计模式之解析器模式

不使用解析器模式的坏处方式1:简单的字符串解析// 问题:只能处理简单表达式public:// 简单的从左到右计算// 不支持优先级、括号等} else {break;break;break;break;// 问题1:不支持运算符优先级// 问题2:不支持括号// 问题3:不支持变量// 问题4:不支持函数// 问题5:错误处理简单方式2:递归下降但硬编码// 问题:解析逻辑和计算逻辑混合private:size_t pos;pos++;

2026-03-11 19:21:36 330

原创 设计模式之状态模式

不使用状态模式的坏处方式1:使用枚举和条件判断private:public:// 问题1:每个方法都有重复的条件判断cout << "支付成功" << endl;cout << "已支付,不能重复支付" << endl;cout << "已发货,不能支付" << endl;// ... 需要处理所有状态cout << "发货成功" << endl;cout << "未支付,不能发货" << endl;// ... 又是所有状态的处理。

2026-03-10 19:54:08 210

原创 设计模式之备忘录模式

不使用备忘录模式的坏处方式1:直接保存状态到历史列表private:// 直接保存内容副本// 分开保存光标位置public:if (!// 问题1:需要为每个状态属性维护一个历史列表// 问题2:如果添加新属性,需要修改所有历史相关代码// 问题3:历史记录直接暴露了内部数据// 问题4:无法添加元数据(时间戳、操作描述等)// 问题5:多个相关列表容易导致数据不一致方式2:使用序列化保存完整对象private:int cursor;

2026-03-10 19:53:35 193

原创 设计模式之组合模式

不使用组合模式的坏处方式1:分别处理不同类型// 问题:需要为每种类型编写不同的处理方法public:// 需要为每种类型写一个方法cout << "处理员工: " << emp->getName() << endl;// 员工特有的处理cout << "处理部门: " << dept->getName() << endl;// 需要递归处理部门下的所有成员i++) {// 但不知道member的具体类型,需要类型判断。

2026-03-10 19:53:00 243

原创 设计模式之迭代器模式

不使用迭代器模式的坏处如果不使用迭代器模式,通常会为每种遍历方式编写特定的代码方式1:直接在聚合类中实现遍历方法// 问题:聚合类变得臃肿private:public:// 每种遍历方式都是一个方法i++) {i >= 0;i--) {// 实现随机播放i++) {// 按年代过滤// 问题1:每增加一种遍历方式,都要添加新方法// 问题2:如果改变存储结构,所有方法都需要修改// 问题3:无法复用遍历逻辑// 问题4:类变得越来越臃肿。

2026-03-10 19:52:26 379

原创 设计模式之职责链模式

不使用职责链模式的坏处方式1:集中式if-else判断// 问题:审批逻辑集中在一个巨大的方法中public:// 大量的if-else判断// 直接主管审批// 部门经理审批} else {return ApprovalResult(false, "部门经理", "部门经理", "预算不足");// 总监审批if (request.getPurpose().find("项目")!} else {// 需要更多说明// CFO审批。

2026-03-10 19:51:35 350

原创 设计模式之中介者模式

不使用中介者模式的坏处方式1:网状结构通信// 问题:每架飞机需要知道所有其他飞机的状态private:// 需要维护所有其他飞机的引用public:// 需要添加所有其他飞机的引用// 请求起飞时需要检查所有其他飞机cout << "飞机 " << flightNumber << " 请求起飞" << endl;// 检查是否有飞机正在起飞或降落cout << " 发现 " << plane->flightNumber << " 正在起降,等待..." << endl。

2026-03-09 20:58:45 355

原创 设计模式之适配器模式

不使用适配器模式的坏处方式1:直接修改客户端代码// 问题:客户端代码需要了解所有库的细节private:public:// 到处都是条件判断// 需要知道MP3库的接口// 需要知道高级音频库的接口// 需要知道视频库的接口else {cout << "不支持的格式" << endl;// 问题:添加新格式需要修改这个方法// 问题:暂停、停止等操作更难统一处理客户端与所有第三方库紧耦合添加新格式需要修改客户端代码代码重复,每个操作都要写条件判断。

2026-03-09 20:36:19 382

原创 设计模式之享元模式

不使用享元模式的坏处方式1:每个字符独立创建对象// 问题:每个字符都是一个独立对象,包含完整的样式信息private:bool bold;int x, y;// 位置信息public:// 显示字符// 创建10000个字符i < 10000;++i) {假设每个对象需要72字节(char, string, 多个int, bool等)10000个字符 = 720,000字节 ≈ 703KB如果有很多相同样式的字符,大量内存浪费方式2:使用数组存储属性。

2026-03-09 20:13:25 364

原创 设计模式之门面模式

不使用门面模式的坏处方式1:客户端直接控制所有子系统// 用户想要开启离家模式public:// 问题1:客户端需要知道所有子系统的接口// 问题2:需要正确的操作顺序// 问题3:可能遗漏某些步骤// 关闭所有灯lights.turnOffSpecific("客厅灯");lights.turnOffSpecific("卧室灯");lights.turnOffSpecific("厨房灯");lights.turnOffSpecific("餐厅灯");

2026-03-09 20:12:43 183

原创 设计模式之代理模式

不使用代理模式的坏处问题1:权限检查分散// 每个访问点都需要重复的权限检查public:// 到处都要写这段代码if (!user ||!cout << "未认证用户" << endl;return;cout << "无查看权限" << endl;return;public:// 又是类似的权限检查,但规则不同if (!user ||!cout << "未认证用户" << endl;return;cout << "无编辑权限" << endl;return;

2026-03-09 20:11:32 317

原创 设计模式之构建器模式

不使用构建器模式的坏处方式1:使用庞大的构造函数public:// 问题:构造函数参数太多,难以使用和维护// 初始化所有成员// 客户端使用时:vector<string> features = {"RGB灯光", "机械键盘"};Computer gamingPC("游戏电脑","2TB SSD","360mm水冷",features);构造函数参数太多,容易混淆顺序可读性差,不知道每个参数的含义许多参数可能是可选的,导致多个构造函数重载添加新参数需要修改所有调用处。

2026-03-08 17:41:32 315

原创 设计模式之原型模式

不使用原型模式的坏处方式1:每次都重新创建和初始化public:// 用户想要创建一个新简历// 每次都从头开始创建和初始化// 重复复杂的初始化过程resume->setTitle(userName + "的简历");resume->addParagraph(new Paragraph("个人简介:..."));resume->addParagraph(new Paragraph("工作经历:..."));

2026-03-08 17:09:23 456

原创 设计模式之抽象工厂

不使用抽象工厂模式的坏处方式1:使用多个独立工厂public:public:// 每个组件都有自己的工厂,客户端需要管理多个工厂private:// ... 为每个组件维护一个工厂工厂数量爆炸(组件数 × 平台数)难以保证产品之间风格一致客户端需要了解并管理多个工厂添加新平台需要修改多处代码方式2:使用条件判断创建private:public:// 到处都是条件判断// 使用这些组件...违反开闭原则,添加新平台需要修改所有创建代码。

2026-03-08 15:59:32 360

原创 设计模式之工厂方法

不使用工厂方法模式的坏处方式1:直接使用new创建对象private:public:// 直接在客户端代码中创建具体对象// ... 其他代码客户端代码与具体产品类耦合创建逻辑分散在各个客户端中添加新的日志类型需要修改所有客户端代码方式2:使用简单工厂public:工厂类职责过重,包含所有产品的创建逻辑添加新产品需要修改工厂类,违反开闭原则无法通过继承来改变创建行为方式3:使用全局函数或宏newFileLoggernew缺乏类型安全调试困难。

2026-03-08 15:13:10 400

原创 设计模式之桥接模式

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。通过使用组合关系代替继承关系,桥接模式可以减少子类的数量,并避免多层继承带来的复杂性分离抽象与实现:将抽象(接口)和实现(具体实现)解耦组合优于继承:通过对象组合建立抽象和实现之间的关系独立变化维度:抽象和实现可以独立扩展,互不影响多维度变化:处理多个变化维度而不导致类爆炸Abstraction(抽象类):定义抽象接口,维护对实现对象的引用RefinedAbstraction(扩充抽象类):扩展抽象类定义的接口Implemen

2026-03-07 17:38:44 336

原创 设计模式之装饰模式

装饰模式是一种结构型设计模式,它允许在不改变现有对象结构的情况下,动态地给该对象添加一些额外的职责。装饰模式通过创建包装对象(装饰器)来包裹真实对象,提供了比继承更有弹性的替代方案。运行时扩展:在不修改对象代码的情况下动态扩展功能组合优于继承:通过对象组合代替类继承,避免类爆炸透明包装:装饰器与被装饰对象具有相同的接口递归装饰:可以嵌套多个装饰器,层层包装Component(组件接口):定义对象接口,可动态添加职责ConcreteComponent(具体组件):实现组件接口的具体对象Decorator(装饰

2026-03-07 17:05:15 318

原创 设计模式之观察者模式

1 紧耦合// 股票类直接依赖具体观察者类// ... 更多具体类型2 违反开闭原则// 每次新增观察者类型都要修改这里// 新增观察者需要添加新的if语句// 需要修改!

2026-03-07 16:44:40 405

原创 设计模式之策略模式

1 违反开闭原则(OCP)// 新增支付方式需要修改原有代码if (type == "alipay") { /* 支付宝逻辑 */ }else if (type == "wechat") { /* 微信逻辑 */ }else if (type == "creditcard") { /* 信用卡逻辑 */ }else if (type == "coupon") { /* 优惠券逻辑 */ }// 新增PayPal支付需要在这里添加else if。

2026-03-07 15:39:30 401

原创 设计模式之模版方法

1 代码冗余严重// 每个导出类都有相同的骨架代码// 准备代码重复...// 读取代码重复...// 写入代码重复...// 清理代码重复...2 难以维护和修改如需修改导出流程(如增加数据校验),需要在所有类中修改容易遗漏某个类,导致不一致3 违反开闭原则每次增加新导出格式都需要从头编写整个流程无法在现有类基础上轻松扩展4 代码质量差相同逻辑分散在各个类中难以统一进行日志、监控、异常处理模板方法模式特别适用于以下场景:算法有固定流程,但某些步骤实现可能不同。

2026-03-07 15:02:31 169

原创 C++ 代码自动生成uml类图

c++ uml类图生成

2024-11-21 10:27:41 4886

原创 wsl利用netsh端口转发实现http代理

这里注意两个问题,遇到过netsh命令正常执行后,但是端口没有被监听。上面命令执行完成后,检查命令是否执行成功。这样就可以实现wsl上的http代理了。检查端口是否正常监听。

2024-01-21 17:18:58 1523 1

原创 常用的shell语法

awk 可以将文件拆分成功若干行, 根据指定的分隔符, 再将每一行拆分成若干列, 默认按照空格或tab进行拆分基本语法格式§ awk 参数 '条件{处理动作}' 操作的文件或数据print num}§ awk 参数 ' /正则表达式 {处理动作 } ' 操作的文件或数据指定分隔符的参数: -F-F分隔符-F:如何使用变量取出某一列?$0 - 代表当前行$1 - 第一列$2 - 第二列$3 …以冒号分隔 如果第三列大于500 就输出第三列值。

2023-08-05 14:45:31 306

原创 cmake入门三 模块的使用和自定义模块

cmake 模块使用自定义find_package 模块

2023-03-13 15:47:58 847

原创 cmake 入门四 常用变量和指令

cmake 常用变量和指令

2023-02-24 18:04:50 2176

原创 cmake 入门二 库的编译,安装与使用

cmake 库的编译与安装

2023-02-24 11:39:29 533

原创 cmake 入门一 多目录编译与安装

cmake 外部编译demo

2023-02-23 17:39:39 925

原创 libcurl 多线程使用

libcurl 多线程

2023-02-20 10:54:29 1324

原创 Makefile 整理

Makefile 详解

2023-02-07 20:19:44 345

原创 各种排序算法整理及c++ 实现

各种排序算法整理及c++实现

2023-02-03 15:58:53 153

原创 linux 修改用户句柄open files

修改用户句柄时,要注意用户句柄数不能大于系统的句柄数,否则对应的用户登录不上机器

2022-08-10 20:41:33 1584

原创 设计模式之单例模式

不使用单例模式的坏处方式1:使用全局变量// 初始化函数// ... 其他初始化// 多个地方使用// 直接访问全局变量全局变量可以被任意修改,破坏封装性难以控制初始化顺序命名空间污染没有统一的访问控制多线程环境下需要到处加锁方式2:传递对象引用private:// 持有配置引用public:// ...// 使用时需要到处传递// 需要将config传递给所有需要的地方// 如果嵌套很深,传递会很麻烦需要将配置对象传递给所有需要使用的地方。

2022-02-19 17:38:46 197

原创 placement new

1什么是placement new?所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说:class foo{};foo* pfoo = new foo;pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存

2022-01-26 17:57:44 214

原创 栈结构与应用

栈结构与应用1 顺序栈#ifndef __STACK__#define __STACK__#include <iostream>using namespace std;//#define ElemType char #define ElemType char #define STACK_INIT_SIZE 8#define STACK_INC_SIZE 3class Stack{public: bool Inc(); void InitStack();

2022-01-05 17:02:32 525

原创 valgrind检测内存泄漏

1 valgrind 安装1.1 valgrind安装包获取http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz21.2 安装tar -jxvf valgrind-3.14.0.tar.bz2cd valgrind-3.14.0./configure --prefix=/home/user1/valgrindmakemake install如果安装的时候采用默认的安装路径,执行configure是可以不加配置–prefix参数具

2021-07-07 17:39:17 1073

原创 linxu磁盘分区与挂载

1、磁盘分区分区介绍分区是将一个硬盘驱动器分成若干个逻辑驱动器,把硬盘连续的区块当做一个独立的磁硬使用,磁盘分区可以防止数据丢失:如果系统只有一个分区,那么这个分区损坏,用户将会丢失所的有数据。增加磁盘空间使用效率:可以用不同的区块大小来格式化分区,如果有很多1K的文件,而硬盘分区区块大小为4K,那么每存储一个文件将会浪费3K空间。这时我们需要取这些文件大小的平均值进行区块大小的划分。数据激增到极限不会引起系统挂起:将用户数据和系统数据分开,可以避免用户数据填满整个硬盘,引起的系挂起分区工具fd

2021-02-26 19:31:40 512

原创 c++ 写实拷贝实现demo

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vld.h> // 内存泄漏检测using namespace std;class String;ostream& operator<<(ostream &out, const String &s);// 引用计数类,通过深拷贝来构造// 同时提供Increase

2020-12-22 22:27:15 238

原创 多态实现通用链表

链表节点的数据域类型不再为具体的数据类型,而是通过一个基类指针引入,达到不借助模板而是通过多态实现通用链表#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>using namespace std;class Object{public: Object(){} virtual ~Object(){} virtual void Print()const = 0; virtual b

2020-12-21 21:19:59 469

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除