自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++实现生产者&消费者的供需关系

从上面的演示中可知,当供给等于需求,即生产&消费时间比例 = 1:1,生产者生产产品速度和消费者消费产品的速度基本保持一致,达到供需平衡。当供给小于需求,即生产&消费时间比例 = 4:1,输出信息明显放慢,说明生产者生产产品速度放慢,导致供给紧张,需求旺盛。当供给大于需求,即生产&消费时间比例 = 1:4,生产者生产产品速度过快,导致产能过剩。预测:如果不限时,当供给小于需求,运行效果中,产出始终慢(效率低下),当供给大于需求,运行效果中,产品越堆越多,产能过剩(内存很可能不足!

2024-09-03 22:23:26 1077

原创 24并发设计模式——线程池模式

实际上线程池模式属于GoF一书23种设计模式的一种或多种设计模式组合。线程池的主要优点包括减少创建和销毁线程的开销、提高资源的利用率、简化线程管理。它适用于需要处理大量短时间任务的场景(如高并发)。在实际应用中,线程池模式有助于提高系统的响应速度和吞吐量,减少资源浪费,并使任务处理更为高效和可控。

2024-09-03 22:23:16 922

原创 23行为型设计模式——迭代器模式

迭代器(Iterator):定义了访问集合元素的接口,通常包括 next() (获取下一个元素)和First()(检查是否存在元素)方法。具体迭代器(Concrete Iterator):实现了迭代器接口,负责管理当前遍历的位置,并提供访问集合元素的具体实现。集合(Aggregate):定义一个创建迭代器对象的接口,通常包括一个CreateIterator()方法。具体集合(Concrete Aggregate):实现了集合接口,提供具体的集合对象,并返回相应的具体迭代器对象。

2024-08-31 12:04:59 754

原创 22行为型设计模式——解释器模式

解释器模式允许你可以将复杂的语句表达式转换成对应的执行代码。这种模式通常用于字符串解析或语言解释器中。它将算术或逻辑表达式设计成一个接一个的独立的“组件”,每个组件负责解释其中一个语法符号的含义。这些组件可以单独构建、组合或重用。

2024-08-31 12:04:46 481

原创 21行为型设计模式——状态模式

状态模式通过将不同状态的行为封装到独立的状态类中,提供了一种清晰的方式来管理对象在不同状态下的行为。虽然它可能引入一些额外的复杂性,但在需要管理多个状态和状态转换时,它能显著提高代码的可维护性和灵活性。

2024-08-31 12:04:29 695

原创 20行为型设计模式——访问者模式

访问者模式在需要对对象结构进行多次扩展操作而不希望修改对象结构本身的场景下非常有效。通过引入访问者,可以方便地添加新操作。值得注意的是访问者模式可能会破坏类的封装性,因为访问者模式要求访问者对象能够访问并调用每一个元素对象的操作,这有时会导致元素对象必须暴露一些内部操作和状态。这种暴露可能会破坏对象的封装性,从而增加系统的复杂性和潜在的错误风险。

2024-08-31 12:00:00 1704

原创 19行为型设计模式——备忘录模式

Originator(发起人)负责创建一个备忘录Memento,记录当前时刻的内部状态。提供创建备忘录和恢复备忘录数据的功能。可以访问备忘录里的所有信息。Memento(备忘录)负责存储Originator的内部状态。防止Originator以外的对象访问备忘录。提供接口供Originator获取和设置状态。Caretaker(管理者)负责管理备忘录Memento。不能访问或操作Memento的内容。

2024-08-29 08:00:00 1373

原创 18行为型设计模式——观察者模式

被观察者(Subject):这是状态发生变化的对象,它维护一个观察者列表并提供方法来附加、移除和通知观察者。观察者(Observer):这是对状态变化做出反应的对象,它通常有一个更新接口,允许被观察者调用这个接口来通知状态变化。Subject和Observer都是面向接口编程,因此具有自己的具体实现类。观察者模式的核心优势在于它能够减少对象之间的耦合性,使得系统更具扩展性和灵活性。其主要用于处理对象之间的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动得到通知并更新。

2024-08-28 08:00:00 1798

原创 17行为型设计模式——中介者模式

中介者(Mediator)定义一个接口用于与各个组件进行通信。具体中介者(ConcreteMediator)实现该接口,负责协调各个组件之间的交互。同事类(Colleague)各个参与交互的对象,通常是需要通过中介者来进行交互的对象。每个同事类对象持有对中介者对象的引用,通过中介者来发送和接收消息。中介者模式集中管理所有对象的交互行为,通过中介者减少对象之间的直接依赖,即不需要各个对象显式的去相互交互,而是由中介者去和各个对象直接交互,一定程度下降低耦合度,并使得系统的设计更加清晰、模块化。

2024-08-27 08:00:00 982

原创 16行为型设计模式——策略模式

策略模式中,每一种算法都被单独的封装成一个策略,客户端通过上下文(Context)平滑地切换不同的算法类。简单来说策略模式就好比向客户提供多种可选方案,让客户自主选择需要执行哪种方案(具体算法类);他的优点也是其缺点,如果客户想根据自身的实际情况选择哪种方案,就必须了解提供的所有可选方案(算法类)的区别。意味着客户需具有统筹全局和精湛专业的能力,以便适时选择恰当的方案(算法类)。

2024-08-26 13:37:42 932

原创 15行为型设计模式——责任链模式

降低耦合度:请求发送者和请求处理者之间不需要直接联系,通过责任链传递请求,解耦了发送者和处理者。动态处理:可以动态地改变处理者链的顺序。增强扩展性:增加新的处理者时,只需添加新处理者而不需修改现有的处理者代码。

2024-08-26 13:37:33 1895

原创 14行为型设计模式——命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户端进行参数化,支持请求的排队和日志记录,以及支持可撤销的操作。命令模式是最常见的方式之一。例如前面几十个设计模式提供的设计方法中a.out本身就是一个命令(可执行程序),当我们去执行a.out可以产生不同的行为或状态。命令模式是一个十分实用的行为型设计模式,将复杂的内部实现(请求)全部封装,对外显示一个命令形态,对客户端来说十分友好。

2024-08-26 13:37:19 41

原创 13行为型设计模式——模版方法模式

通过模板方法模式,我们可以确保算法的结构不被改变,同时允许子类提供具体的细节实现。

2024-08-26 13:36:58 372

原创 12结构型设计模式——享元模式

享元模式的核心思想就是分离对象的变与不变部分,将可以共享的部分(不变部分)提取出来进行共享,以减少内存消耗和提高系统性能,例如flyweight.cpp中的代码设计中把字体的大小作为相同(不变)的部分,作为共享对象数据,而不同的形态则作为外部对象引入。

2024-08-26 13:35:55 1111

原创 11结构型设计模式——外观模式

外观模式的应用可以使看起来复杂的外观简化,使得系统看起来更加直观和方便。外观模式的缺点可能引入过度封装:外观类可能会过度封装,导致子系统的某些功能无法被直接访问。不适用于所有场景:对于需要高度定制的场景,外观模式可能不适用,因为它提供的是统一的接口,可能无法满足所有特定需求。

2024-08-18 14:10:51 1265

原创 10结构型设计模式——桥接模式

DrawingAPI 是平台接口,定义了绘制方法。WindowsAPI 和 MacOSAPI 、LinuxAPI 是具体实现,提供平台特定的绘制方法。UIComponent 是抽象层,持有DrawingAPI 的引用。Button 和 TextBox 是具体的UI组件,实现了 UIComponent。桥接模式通过分离抽象和实现,使得UI组件的抽象层可以与不同的平台实现解耦,从而使得支持新平台或修改现有平台的实现变得更加容易。

2024-08-18 14:10:35 977

原创 09结构型设计模式——组合模式

组合模式通过提供一个统一的接口来处理单个对象和对象组合,使得客户端能够以一致的方式操作树形结构中的元素,比如composite.cpp的代码设计中接口提供了统一的add()方法模拟目录和文件的包含关系,最后使用list()方法直观显示树形组合结构。组合模式特别适合处理具有部分-整体结构的系统,其中对象可以被递归地组合成树形结构。它使得客户端能够以一致的方式对待单个对象和对象组合,从而简化了代码和操作,提高了系统的灵活性和扩展性。

2024-08-18 14:09:07 791

原创 08结构型设计模式——适配器模式

适配器(Adapter):充当客户端与目标接口之间的桥梁。它实现了客户端期望的接口,并将请求委托给被适配的对象。目标接口(Target Interface):客户端期望使用的接口。被适配者(Adaptee):已有的类,它的接口与客户端期望的接口不兼容。客户端(Client):使用目标接口的代码。适配器模式的本质是将一个类的接口转换为客户端所希望的另外一个接口。

2024-08-18 14:08:50 968

原创 07结构型设计模式——装饰器模式

装饰器模式允许在不改变对象结构的情况下,动态地给一个对象添加功能。这种模式通过创建一个装饰类来包装原有类的对象,从而增加新的功能。装饰器模式是面向对象编程中常用的一种设计模式,适用于需要在运行时动态地扩展对象功能的情况。动态扩展功能装饰器模式允许在不修改原有类的情况下,通过添加装饰器类来动态地扩展对象的功能。这在需要根据不同的需求或条件来增加功能时非常有用。增强类的灵活性通过组合装饰器对象,可以灵活地组合和扩展功能。

2024-08-18 14:08:05 906

原创 06结构型设计模式——代理模式

代理模式适用于为其他对象提供一种代理以控制对这个对象的访问。代理模式,作为结构型设计模式之一,广泛应用于软件设计的各个领域,其核心就是引入一个代理对象来控制对目标对象的访问。在实际生活和软件系统中,代理模式有很多体现,比如代驾、代练、代购机票等,都能看做是代理模式的实际应用。举例:在组织结构中,秘书通常被视为老板的代理,他们帮助处理外来事务,转达重要信息,代理老板的职责。此外,在网络通信中,代理服务器也是代理模式的典型应用,它提供了中转服务,对外可以隐藏内部网络结构,对内则对外部请求进行过滤和处理。

2024-08-18 14:06:55 784

原创 05创建型设计模式——原型模式

原型模式的深拷贝和浅拷贝技术其实就是利用了指针的特性,指针本身具有指向的作用,当指针指向了堆区没有任何方法去拷贝或析构该堆区的数据,就造成了多个指针指向同一个堆区空间或多次析构的问题。

2024-08-18 14:06:13 686

原创 04创建型设计模式——建造者模式

复杂对象的构建当一个对象的构建过程包含多个步骤或组件时,建造者模式可以帮助将这些步骤分开,从而使构建过程更加清晰和易于管理。例如,构建一个具有多种配置选项的复杂数据结构或图形用户界面(GUI)组件。建造者模式模仿建筑行业的建造行为,设计师设计好图纸交给工程队,工程队根据图纸建造房子,房子建造好之后交给客户。设计的代码中将构造(设计师的图纸)和表示(工程队造的房子)完美分离,这样可以把复杂的部分简单化,最后有机地组合在一起最终形成我们想要的产品。

2024-08-12 23:35:50 705

原创 03创建型设计模式——抽象工厂模式

创建相关或相互依赖的对象抽象工厂模式可以确保客户端只通过工厂接口创建一组相关或相互依赖的对象,而不需要了解具体的对象类。这种方法可以确保这些对象能够一起正常工作。例如,我的代码中,NorthFactory和 SouthFactory创建了一系列北方或南方的水果,确保了这些水果的创建和使用是一致的。抽象工厂模式通过提供一个创建一系列相关对象的接口,解耦了客户端代码和具体产品类,使得系统具有更好的灵活性和扩展性。它广泛应用于各种软件系统中,尤其是需要创建和管理多种相关对象的场景。

2024-08-11 15:17:34 1021

原创 02创建型设计模式——工厂模式

工厂方法模式(Factory Method Pattern)同样属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作(延迟)放到子类当中实现。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。(工厂模式生产专一产品)GoF一书对工厂方法模式的介绍工厂方法模式允许一个类的实例化由子类来决定。

2024-08-11 13:36:39 987

原创 01创建型设计模式——单例模式

单例模式(Singleton Pattern)是一种创建型设计模式(GoF书中解释创建型设计模式:一种用来处理对象的创建过程的模式),单例模式是其中的一种,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这个模式适用于那些需要一个全局唯一的对象来协调系统中的行为的情况。即在整个程序运行过程中,该类只存在一个对象(实例)。GoF一书对单例模式的介绍。

2024-08-11 00:00:43 1022

原创 C++的7种设计模式原则

高内聚指的是一个模块或类的职责应该高度集中,即模块或类应当完成单一且明确的功能。

2024-08-10 18:29:08 870

原创 Ubuntu安装和简单操作MySQL工具

无论是什么程序,如果涉及到信息存储,比如耗材记录,电话信息,聊天记录,多媒体视频,电子书等数据不仅需要硬盘等这些硬件存储介质,也需要一个后台工具来管理这些数据,尤其像某宝、某东、某多多,英雄联盟、王者荣耀、逆水寒等这类大型软件都需要一个强大的数据库工具来精准高效的维护这些具有隐私性、高价值的信息,而MySQL是为数不多的免费开源的关系型数据库管理系统工具,通过SQL语言操作MySQL工具来管理数据库的日志、权限、数据备份、数据恢复、集群管理等作业。

2024-07-28 19:37:43 1263

原创 用程序画出三角形图案

运行效果代码描述:外层循环控制行数,从1行到rows行,内层循环打印一个星号和一个空格,用于格式化输出(空格在计算机中本身也代表一个符号,只是输出不可见),我们能看到的只有星号,就形成了视觉上的直角三角形图案。

2024-07-20 20:30:41 301

原创 求解一元二次方程的根

复数和实数是数学中两个重要的数系,它们之间有几个关键的区别:实数定义实数是所有可以在数轴上表示的数,包括正数、负数、零、整数、分数和无理数(如 (\sqrt{2}))。形式实数的标准形式就是通常我们所见的普通数字,如 (1)、(-2)、(0.5) 等。表示实数可以用单一的数值表示,没有虚部。例如,实数 ( x ) 可以写成 ( x + 0i ),其中虚部为零。运算实数可以进行加法、减法、乘法、除法等基本运算,其结果仍然是实数。复数定义复数是由实数和虚数组成的数。

2024-07-20 18:25:53 1739

原创 欧几里得算法求解若干数的最小公倍数

先通过欧几里得算法求出两个数的最大公约数,然后调用lcm函数获取最小公倍数,再调用lcm_multiple函数对多个数依次调用lcm函数,求得他们的最小公倍数,初始时,将第一个数作为初始结果,然后依次与后续的数求最小的公倍数,直至处理完所有的数。公倍数(common multiple)是指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数。公倍数中最小的数,就称为这些整数的最小公倍数(lowest common multiple)求多个数的最小公倍数,该怎么求呢?

2024-07-14 18:46:23 218

原创 欧几里得算法求解若干数的最大公约数

这个算法基于如下数学原理,gcd(a,b) = gcd(b,a % b),一直到b为零时,a就是最大的公约数。然后计算多个数的最大公约数使用gcd_multiple接受一个整数,使用gcd函数多次计算,初始时,result为第一个数,遍历到最后,result为1,说明没有最大公约数了,跳出循环。公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,例如:12和15的公约数有1,3,最大公约数就是3。再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10。公约数,亦称“公因数”。

2024-07-14 18:16:00 191

原创 2024年是不是闰年?

朱利叶斯·凯撒在公元前46年颁布了一项法令,规定每四年增加一天,即闰日,来弥补这种时间差异,这一年被称为“闰年”。原来在古代,人们的计算存在误差,只有平年的情况下,会导致历法与地球的公转周期不一致,季节和节气的计算就不那么精准了,这可把勤劳的农民急坏了,伟人看在眼里,心疼,于是设计了闰年,用来弥补平年带来的不足。格里高利历沿用了朱利叶斯·凯撒的闰年规则,并进一步精确到了每400年有97个闰年的周期。学会编程,可以用来解决生活的很多问题,帮助我们免于复杂的计算,省去冗余的步骤,小到日常生活,大到芯片制造。

2024-07-14 16:07:08 233

原创 猴子吃桃(迭代算法)

传说很久很久以前,一只小猴子听妈妈的话,不远万里,爬山涉水专门跑到王母娘娘的蟠桃园里偷桃子吃,小猴子趁王母娘娘闭关修炼,偷了许多桃子,直到被蟠桃园的守卫发现,才恋恋不舍的逃走,小猴子逃跑的第一天,他看到兜里的美味桃子,贪吃了一半,然后忍不住又吃了一个;逃跑的第二天又吃了一半,再加上一个;后面每天都是这样吃;直到第十天,小猴子到家了,妈妈问:孩子,你摘了几个桃子呀?小猴子说:我摘了好多好多呢!小猴子一掏裤兜发现只有一个桃子了。妈妈说你撒谎呀?看我不打你屁屁!小猴子急了!

2024-07-13 23:55:14 599

原创 控制单/多用户权限

Unix/类Unix是一个多用户的操作系统,拥有众多的发行版系统。单一用户可以使用chmod命令修改可读可写可执行权限。多用户使用chmod就显得力不从心了。多用户操作权限则使用ACL规则(Access Control List),即访问控制列表,ACL规则允许管理员为每个文件或目录指定多个用户或组的权限,更精细的控制文件和目录的访问方式。

2024-07-13 13:08:33 912

原创 水仙花数算法

希腊神话故事传说希腊神话里,美少年纳西索斯(Narcissus)是希腊最俊美的男子,无数的少女对他一见倾心,可他却自负地拒绝了所有的人。这当中包括美丽的山中仙女伊可(Echo)。伊可十分伤心,很快地消瘦下去。最后,她的身体终于完全消失,只剩下忧郁的声音在山谷中回荡。此后,希腊人便用伊可的名字(Echo)来表示“回声”。((~ ̄▽ ̄)~有点像shell语言的echo命令)后来,爱神阿佛洛狄听说美丽的山中仙女伊可死亡,感到十分愤怒,决定让纳西索斯去承受痛苦:爱上别人,却不能以被爱作为回报。

2024-07-07 19:19:11 308 1

原创 make工具

Makefile是个文件,这个文件中描述了咱们程序的编译规则,咱们执行make命令的时候,make命令会在当前目录下寻找Makefile文件,根据Makefile文件里的规则,编译咱们的程序。注意Makefile文件是咱们程序员根据自己的程序,编写的编译规则文件。Makefile中我们通常只需要定义自定义变量和重新定义系统环境变量,而不需要定义预定义变量。预定义变量通常是通用的,像正则表达式的元字符,具有特殊的含义。$@ # 目标名$< # 依赖文件列表的第一个文件。

2024-07-07 14:29:14 1110

原创 gcc的编译C语言的过程

GCC(GNU Compiler Collection)是由GNU项目开发和维护的一套开源编程语言编译器集合。它支持多种编程语言,包括但不限于C、C++、Objective-C、Fortran、Ada等。GCC被广泛应用于编译和优化各种程序,是许多开发者和组织的首选工具之一。gcc默认编译C语言。

2024-07-06 23:19:03 1265

原创 Ubuntu更新源

在Debian系中,Ubuntu是很火的一款开源系统产品。: 将本地软件包列表与远程仓库中的最新列表同步,这样系统就可以了解到所有可用的软件包及其版本信息。: 更新操作会检查每个软件包的最新版本号和依赖关系,确保系统中的软件包信息是最新的。: 有时候软件包索引可能过时或损坏,运行可以修复这些问题,使得后续的软件包安装和升级操作能够正常进行。

2024-06-30 14:43:22 1758

原创 选择排序算法

小结:选择排序算法它每一轮排序过后在未排序部分选取最小(或最大)的元素,然后放到已排序部分的末尾,直到所有的元素都排序完毕,这种排序算法仿佛我在千万人海中挑一群人排队去滑稽,先挑出个子高的排在后面,然后再挑出稍微高的排在中间,最后挑出个子矮的排在前头。时间复杂度:选择排序的时间复杂度为 ( O(n^2) ),其中 ( n ) 是数组的大小。这是因为每次选择都要扫描剩余未排序的部分。空间复杂度:选择排序是一种原地排序算法,只需要常数级别的额外空间用于存储临时变量,空间复杂度为 ( O(1) )。稳定性。

2024-06-29 16:59:08 430

原创 冒泡排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复地进行直到列表中没有需要交换的元素,这意味着列表已经排序完成。

2024-06-29 15:55:08 325

shell脚本对文本文件的切割

打包的程序案例和操作说明

2023-09-10

网络调试助手(netassist5.0.2)

网络调试助手(netassist5.0.2)

2023-06-25

奇妙的进程-多进程间的通信篇

用作socket_udp.c的可执行文件执行的接收端

2023-06-03

空空如也

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

TA关注的人

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